# hashline64 Ein schlankes, sicheres und Unix-konformes Filter zur zeilenbasierten Erzeugung von Hashwerten aus Datenströmen. ## Der FNV-1a-Hash-Algorithmus Das Tool nutzt den **FNV-1a-Algorithmus**, eine nicht-kryptografische Hashfunktion, die sich durch einfache Implementierung, hohe Verarbeitungsgeschwindigkeit und effiziente Bit-Verteilung auszeichnet. * **Mathematisches Prinzip:** Der Algorithmus verwendet zwei auf die 64-Bit-Breite abgestimmte Konstanten: die *Offset-Basis* als Startwert (verhindert identische Hashes bei leeren oder Null-Strings) und die *FNV-Primzahl*. Die Multiplikation mit der Primzahl bewirkt bei jedem Schritt eine vollständige Durchmischung der Bits (Lawineneffekt). * **Unterschied zu FNV-1:** Im Gegensatz zu FNV-1 führt FNV-1a die XOR-Operation vor der Multiplikation durch. Dies verbessert die Durchmischung des jeweils letzten Bytes eines Strings. * **Vergleich mit djb2:** FNV-1a nutzt im Vergleich zu djb2 eine 64-Bit-Primzahl statt des Faktors 33. Dadurch bietet er eine bessere Bit-Verteilung und eine geringere Kollisionsrate bei ähnlichen Strings, bei nahezu identischer Verarbeitungsgeschwindigkeit. * **Anwendungsbereiche:** Optimiert für Hash-Tabellen, In-Memory-Prüfsummen und die Datendeduplizierung. * **Einschränkung:** Da die Funktion nicht kryptografisch sicher ist, ist sie anfällig für gezielte Kollisionsangriffe (Hash-Flooding / DoS-Angriffe). ## 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: ```bash ... | cut -c-65532 | hashline64 ``` 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: ```bash ... | fold -w 65532 | hashline64 ``` 3. **Fragmentierung mit Trennmarker:** Ein vorgeschalteter `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: ```bash ... | awk '{while(length($0)>65535){printf "%s\036\n",substr($0,1,65532);$0=substr($0,65533)}print}' | hashline64 ``` ## 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.