Wie funktionieren Hash-Funktionen und warum entstehen Kollisionen?
Das Konzept: Von beliebiger Eingabe zu fester Ausgabe
Du kennst bereits Dictionaries und Maps und weißt, dass sie Daten in $O(1)$ (konstanter Zeit) finden können. Der Motor hinter dieser enormen Geschwindigkeit ist die Hash-Funktion. Sie ist ein mathematischer Algorithmus, der Eingabedaten beliebiger Größe (z. B. ein kurzes Passwort, eine E-Mail-Adresse oder ein komplettes Buchmanuskript) in einen Ausgabewert mit fester Größe umwandelt – den sogenannten Hash-Wert.
Dieser Hash-Wert dient als direkter Index (vergleichbar mit einer exakten Seitenzahl in einem Lexikon) für eine Hash-Tabelle. Anstatt eine Liste Element für Element durchsuchen zu müssen, berechnet die Hash-Funktion sofort den genauen Speicherort. Das ermöglicht einen hocheffizienten Datenzugriff, da der Umweg über das Durchsuchen des gesamten Datenbestands entfällt.
Die drei Eigenschaften einer effizienten Hash-Funktion
Damit dieser schnelle Zugriff in der Praxis zuverlässig funktioniert, muss eine Hash-Funktion drei zentrale Kriterien erfüllen:
- Determinismus: Dieselbe Eingabe muss immer exakt denselben Hash-Wert erzeugen. Würde das Passwort
"geheim123"bei jeder Berechnung einen anderen Index ausgeben, könntest du es in der Hash-Tabelle nie wiederfinden. - Schnelle Berechenbarkeit: Die mathematische Umwandlung muss in Bruchteilen von Millisekunden passieren. Dauert das Hashen zu lange, geht der Geschwindigkeitsvorteil beim Datenzugriff sofort verloren.
- Gleichmäßige Verteilung (Uniformity): Die generierten Hash-Werte sollten möglichst gleichmäßig über den gesamten verfügbaren Speicherbereich gestreut werden. Wenn sich viele Eingaben auf denselben Hash-Wert drängen, entstehen Engpässe und die Effizienz sinkt drastisch.
Kollisionen und das Schubfachprinzip
Selbst die beste Hash-Funktion stößt an eine unumstößliche mathematische Grenze: das Schubfachprinzip (Pigeonhole Principle). Stell dir vor, du hast einen Schrank mit 10 Schubfächern, musst aber 11 Briefe einsortieren. Zwangsläufig müssen in mindestens einem Fach zwei Briefe landen.
Genau das passiert beim Hashen. Da die Menge der möglichen Eingabedaten (z. B. alle denkbaren Zeichenketten der Welt) unendlich groß ist, die Menge der möglichen Hash-Werte durch ihre feste Länge aber strikt begrenzt ist, kommt es unweigerlich zu Kollisionen. Eine Kollision tritt auf, wenn zwei völlig unterschiedliche Eingaben (z. B. "Haus" und "Baum") zufällig denselben Hash-Wert erzeugen und somit auf denselben Speicherplatz in der Hash-Tabelle zugreifen wollen. Eine gute Hash-Funktion minimiert diese Kollisionen durch eine gleichmäßige Verteilung, kann sie aber niemals komplett verhindern.
Teste dein Wissen
Du wendest dieselbe Hash-Funktion auf ein kurzes Passwort und eine 500-seitige Logdatei an. Wie verhalten sich die resultierenden Hash-Werte?