qr-swastika-avoider v0.1.0 — Vermeidung versehentlich entstehender Swastika-Muster in QR-Codes
(crates.io)- Ein Rust-Crate, das Swastika-Muster erkennt, die zufällig in QR-Codes entstehen können, und optional QR-Codes ohne solche Muster erzeugt
- Rendert alle 8 Maskenmuster des QR-Standards, filtert Kandidaten ohne solche Muster heraus und wählt dann die Maske mit der niedrigsten ISO/IEC-18004-Strafe
- Schließt Finder-, Timing-, Alignment-, Format- und Versionsmodule von der Prüfung aus und berücksichtigt den Umgebungskontrast, damit Funktionselemente oder unsichtbare Formen nicht fälschlich erkannt werden
- Der Standard-Detektor ist ohne externe Abhängigkeiten aufgebaut, verbietet
unsafe-Code und unterstützt mehrere QR-Bibliotheken sowie die Darstellung alsVec<Vec<bool>> - Der Erkennungsbereich ist auf achsenbündige 5×5- und 7×7-Hakenkreuzformen in beiden Richtungen und mit beiden Farbpolaritäten beschränkt; 45°-, diagonale und beliebig gedrehte Formen werden nicht unterstützt
Warum versehentliche Muster vermieden werden sollten
- qr-swastika-avoider erkennt und vermeidet Swastika-Muster, die zufällig in QR-Codes erscheinen können
- QR-Codes wählen normalerweise aus 8 austauschbaren Maskenmustern das mit der besten Lesbarkeitsbewertung aus, prüfen aber nicht auf Symbole, die Anstoß erregen könnten
- Kleine und schmale Muster lassen sich im Bewertungsprozess des QR-Standards nur schwer herausfiltern und können deshalb zufällig im endgültigen Code verbleiben
Erkennung unter Berücksichtigung von Funktionselementen und Kontrast
- Der Standard-Detektor kommt ohne externe Abhängigkeiten aus und verwendet
#![forbid(unsafe_code)] - Über ein kleines
QrModules-Trait mit zwei Methoden lassen sich verschiedene QR-Darstellungsformate prüfen - Finder-, Timing-, Alignment-, Format- und Versionsmodule werden von der Erkennung ausgeschlossen, damit z. B. Finder-Ecken nicht fälschlich als Swastika erkannt werden
- Muster, die im gleichfarbigen Modulbereich eingebettet und tatsächlich nicht sichtbar sind, werden anhand des Umgebungskontrasts ignoriert; dieser Schwellenwert ist anpassbar
- Bestehende QR-Codes lassen sich mit
contains_swastikaprüfen; wird ein Muster gefunden, kann der Code neu erzeugt oder der Nutzer gewarnt werden
Unterstützte QR-Darstellungen und Bibliotheken
- Per Cargo-Feature werden folgende Adapter bereitgestellt
qrcodegen:qrcodegen::QrCode-QrModulesqrcode:qrcode::QrCode-QrModulesfast_qr:fast_qr::QRCode-QrModules
- Die rohe Modulmatrix
Vec<Vec<bool>>wird ebenfalls ohne separaten Adapter unterstützt;truesteht für ein dunkles Modul
Erzeugung musterfreier QR-Codes
encode_safeaus demgenerate-Feature nimmt Inhalt und Fehlerkorrekturstufe entgegen und gibt einen scanbaren QR-Code ohne solche Muster zurück; ist das nicht möglich, wird ein expliziter Fehler zurückgegeben- Während der Erzeugung werden alle 8 Masken gerendert, danach bleiben nur Kandidaten ohne die erkannten Muster übrig
- Unter den verbleibenden Kandidaten wird die Maske mit der niedrigsten ISO/IEC-18004-Strafe zurückgegeben, sodass die Lesbarkeitsoptimierung des Standards erhalten bleibt
- Über
matrix()lässt sich die Modulmatrix abrufen und mitmask()die gewählte Maske prüfen
Cargo-Feature-Konfiguration
- Die Standard-Features enthalten nur den abhängigkeitsfreien Detektor
- Die Features
qrcodegen,qrcodeundfast_qrfügen Adapter für die jeweiligen Bibliotheken hinzu - Das Feature
generatebringtqrcodegenals Abhängigkeit mit und stelltencode_safebereit
Erkennungsbereich und Lizenz
- Erkannt werden klassische achsenbündige Hakenkreuzformen in 5×5 und 7×7, in beiden Richtungen und mit heller wie dunkler Farbpolarität, innerhalb einer kleinen Toleranz
- 45°- oder diagonale Muster sowie beliebig gedrehte Formen fallen nicht in den Erkennungsbereich
- Veröffentlicht unter der MIT License
1 Kommentare
Meinungen auf Lobste.rs
Verwirrend ist, dass dieses Projekt zwar religiöse Swastika-Symbole vermeidet, aber ausgerechnet nicht das von den Nazis verwendete Hakenkreuz. Das Nazi-Symbol ist um 45 Grad gedreht, doch das Projekt stellt ausdrücklich klar, dass „45-Grad-/diagonale Motive und beliebige Rotationen außerhalb des Umfangs“ liegen.
Zufällig entstehende Bilder in QR-Codes haben eine niedrige Auflösung; dadurch ist es eher wahrscheinlich, dass gerade die nicht gedrehte Form klar als Hakenkreuz erkannt wird und nicht bloß als zufälliges Pixelmuster. Sich darauf zu konzentrieren, ist sinnvoll.
Außerdem heißt es, „Finder-, Timing-, Ausrichtungs-, Format- und Versionsmodule werden ausgeschlossen, damit Finder-Ecken nicht fälschlich als Hakenkreuze erkannt werden“. Wenn jemand in einem QR-Code ein anstößiges Symbol sieht, wird sich die Reaktion aber nicht danach unterscheiden, ob die Pixel Daten oder ein Timing-Muster sind. Finder-Ecken sind einfach Quadrate; ich sehe auch keinen Grund, warum man sie unbedingt aus der Analyse ausschließen müsste. Je tiefer man sich damit befasst, desto weniger passt es zusammen, sodass ich vermute, dass es sich um ein von KI grob generiertes Ergebnis handelt.
Es macht mich traurig, dass es so ein Projekt überhaupt gibt. Ich hatte nicht einmal daran gedacht, dass in einem QR-Code zufällig ein anstößiges Symbol auftauchen könnte.
Ich habe selbst nachgerechnet, „wie oft entsteht beim Erstellen eines einfachen QR-Codes zufällig ein riesiges Nazi-Symbol?“ QR-Codes sind nicht völlig zufällig, aber das ignoriere ich hier.
Betrachtet man 5×5- und 7×7-Hakenkreuze unabhängig, gibt es jeweils zwei Links-rechts-Richtungen, zwei Polaritäten sowie gespiegelte und normale Formen, also insgesamt 8 Muster. Die Gesamtzahl der Muster beträgt bei 5×5 2^25 = 33 Millionen und bei 7×7 2^49 = 562 Billionen; damit liegt die Wahrscheinlichkeit, dass ein Hakenkreuz enthalten ist, bei 2,38e-7 bzw. 1,42e-14. In einem QR-Code gibt es 289 Bereiche mit 5×5 und 225 Bereiche mit 7×7, daher liegt die Gesamtwahrscheinlichkeit, dass in einer zufälligen QR-Code-Form mindestens ein Hakenkreuz auftaucht, bei etwa 0,00006, also 1 von 14.500. 9×9 und größer könnte man ebenfalls berechnen, aber die Wahrscheinlichkeit einer bestimmten Pixelkombination ist so niedrig, dass sie das Ergebnis nicht sinnvoll beeinflusst. Leider sieht es im Source so aus, als sei dieses Projekt per Vibe Coding entstanden, aber die Berechnung habe ich selbst von Hand gemacht.
Bei einem so speziellen Projekt frage ich mich, ob es dazu eine Hintergrundgeschichte oder einen Witz gibt.
Andererseits: Wenn man sieht, dass fehleranfällige KI eingesetzt wird – etwa der Perceptual Hash von Microsoft photoDNA, der mit Gittern aus CSAM-Thumbnails in Trainingsdaten schlecht zurechtkommt und dadurch Discord-Nutzerkonten allein wegen Screenshots von Tabellen und Minecraft-Crafting-Gittern sperrt –, wirkt ein allgemeineres Tool zur Vermeidung riskanter Muster durchaus attraktiv.
Man sollte reale Probleme lösen, statt Probleme der Vergangenheit auf neue Weise zu wiederholen. Es gibt zu viele überempfindliche Menschen auf der Welt, die so ein Projekt interessant finden würden.
Selbst wenn das Ziel ist, Hakenkreuze in Datenmustern zu vermeiden: Da die Webseite das Symbol selbst anzeigt, frage ich mich, ob das in Deutschland illegal sein könnte.
Nach diesem Urteil des Bundesgerichtshofs sind durchgestrichene Hakenkreuze zulässig; und da die übrigen offenbar als Beispiele für Muster gezeigt werden, die der Code herausfiltern soll, scheint es eher unwahrscheinlich, dass es Probleme gibt.
https://en.wikipedia.org/wiki/Strafgesetzbuch_section_86a