## hashline128 Ein schlankes, sicheres und Unix-konformes Filter zur zeilenbasierten Erzeugung von Hashwerten aus Datenströmen. ## Der MurmurHash3 (128-Bit)-Algorithmus Das Tool nutzt die 128-Bit-Variante des MurmurHash3-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 (zwei parallele 64-Bit-Hälften für die 128-Bit-Generierung) und nutzt mathematische Operationen wie Multiplikationen, Bit-Rotationen (Rotates) und XOR-Verknüpfungen mit vordefinierten, mathematisch optimierten Konstanten. Am Ende des Datenstroms werden die internen Zustände gemischt (Finalisierung) und zu einem einzigen 128-Bit-Hashwert zusammengeführt. * Unterschied zu FNV-1a: Während FNV-1a Daten strikt Byte für Byte verarbeitet, nutzt MurmurHash3 intern Instruction-Level Parallelism (ILP). Dadurch ist MurmurHash3 bei größeren Datenmengen um ein Vielfaches schneller und lastet die CPU-Pipeline optimal aus. * Vergleich mit djb2 und xxHash: MurmurHash3 übertrifft ältere Funktionen wie djb2 in der Verarbeitungsgeschwindigkeit bei gleichzeitig exzellenter Verteilung der Hashwerte. Er besteht alle strengen statistischen Tests der SMHasher-Prüfsuite und bietet durch die 128-Bit-Ausgabe eine astronomisch geringe Kollisionswahrscheinlichkeit, die selbst bei extrem großen Datenmengen einen sicheren Einsatz in Hashtabellen ermöglicht. * Anwendungsbereiche: Optimiert für Hochgeschwindigkeits-Prüfsummen, Echtzeit-Datenströme, Dateivergleiche und performante In-Memory-Hashtabellen (z. B. in Datenbanken oder Routern). * 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 | hashline128 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 | hashline128 3. Fragmentierung mit Trennmarker: Ein vorgeschalteter awk-Befehl bricht überlange Zeilen inklusive eines Trennmarkers (\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}' | hashline128 ## 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.