## xxhashline64 Ein schlankes, sicheres und Unix-konformes Filter zur zeilenbasierten Erzeugung von Hashwerten aus Datenströmen. ## Der xxHash (XXH64)-Algorithmus Das Tool nutzt den XXH64-Algorithmus, eine extrem schnelle, nicht-kryptografische Hashfunktion, die speziell auf die Leistung moderner 64-Bit-Prozessoren optimiert ist und die RAM-Geschwindigkeitsgrenzen erreicht. - Mathematisches Prinzip: Der Algorithmus verarbeitet Daten in großen Blöcken (4 parallele Spuren à 64-Bit) und nutzt mathematische Operationen wie Multiplikationen, Bit-Rotationen (Rotates) und XOR-Verknüpfungen mit vordefinierten, mathematisch optimierten Primen. Am Ende des Datenstroms werden die Spuren zu einem einzigen 64-Bit-Hashwert zusammengeführt (Finalisierung). * Unterschied zu FNV-1a: Während FNV-1a Daten strikt Byte für Byte verarbeitet, nutzt XXH64 intern Instruction-Level Parallelism (ILP). Dadurch ist XXH64 bei größeren Datenmengen um ein Vielfaches schneller und lastet die CPU-Pipeline optimal aus. * Vergleich mit djb2 und MurmurHash3: XXH64 übertrifft djb2 und MurmurHash in der Verarbeitungsgeschwindigkeit bei gleichzeitig exzellenter Verteilung der Hashwerte. Er besteht alle strengen statistischen Tests der SMHasher-Prüfsuite (keine bekannten systematischen Kollisionen oder Schwächen im Lawineneffekt). * Anwendungsbereiche: Optimiert für Hochgeschwindigkeits-Prüfsummen, Echtzeit-Datenströme, Dateivergleiche und performante In-Memory-Hashtabellen. * Einschränkung: Da die Funktion nicht kryptografisch sicher ist, ist sie anfällig für gezielte Kollisionsangriffe (Hash-Flooding / DoS-Angriffe), falls Angreifer die Eingabedaten vollständig kontrollieren können. ## Puffer-Verhalten (Fail-Fast) Das Programm verarbeitet Zeilen bis zu einem festen Limit von 64 KB (BUFSIZE / 65535 Bytes). Wenn eine Zeile diese Grenze überschreitet, verhält sich das Tool nach dem Fail-Fast-Prinzip: * Es beendet den Datenstrom kontrolliert mit dem Exitcode 0. * Es findet keine Speicherallokation über das Limit hinaus, keine stillschweigende Datenmanipulation und kein Programmabsturz statt. * Ein separater Fehlercode wird nicht ausgegeben, da es sich um ein definiertes, dokumentiertes Programmverhalten handelt. Die Überschreitung ist im Datenstrom selbst erkennbar, da die letzte Zeile exakt der maximalen Puffergröße entspricht (wichtig für die Nachverfolgbarkeit in Logfiles). ## Architektur und Unix-Philosophie Das restriktive Verhalten folgt der Unix-Philosophie („Do one thing and do it well“). Durch den Verzicht auf Funktionen wie dynamische Speicherverwaltung (realloc) bietet das Tool spezifische Vorteile: * Performance: Keine Laufzeitverluste durch dynamische Speicherallokation. * Sicherheit: Der statische Puffer schließt Heap-Exploits strukturell aus. * Kompaktheit: Die geringe Codegröße eignet sich optimal für die statische Verlinkung mit musl-gcc. * Plattformsicherheit: Die softwareseitige Härtung mittels -fstack-protector-strong und -static-pie sichert verbleibende Risiken ab. ## Integration in Pipelines Anpassungen an Datenströme außerhalb der Norm müssen durch vorgeschaltete Werkzeuge in der Pipeline gelöst werden. ## Optionen zur Vorverarbeitung: 1. Abschneiden überlanger Zeilen: Ein vorgeschaltetes cut verhindert das Terminieren des Programms und schützt Systemressourcen: ... | cut -c-65532 | xxhashline64 2. Erzwingen von Zeilenumbrüchen: Ein vorgeschaltetes fold bricht überlange Datenströme aktiv nach einer bestimmten Zeichenanzahl um. Das verhindert das Beenden des Programms, verändert jedoch die Struktur der Eingabedaten für die Hash-Kalkulierung: ... | fold -w 65532 | xxhashline64 3. Fragmentierung mit Trennmarker: Ein vorgeschalter awk-Befehl bricht überlange Zeilen inklusive eines Trennmakers (\036) sauber um, damit die Verarbeitung fortgesetzt wird. Die Fragmente müssen im späteren Verlauf manuell zusammengeführt werden: ... | awk '{while(length($0)>65535){printf "%s\036\n",substr($0,1,65532);$0=substr($0,65533)}print}' | xxhashline64 ## Anpassung der Puffergröße Das Limit von 64 KB ist fest gewählt, um den Speicherbedarf gering zu halten. Da der Quellcode gemeinfrei (Public Domain) ist, können Anwender bei Bedarf die Konstante BUFSIZE im Quellcode manuell anpassen und eine eigene Binärdatei kompilieren.