Was ist eine Hashfunktion?
#Code

Was ist eine Hashfunktion?

Wer in der Entwicklungswelt unterwegs ist wird früher oder später einmal über Hashfunktionen stolpern. Was ist eine Hashfunktion? Sie geben für einen Input immer den selben Output mit konstanter Länge aus und können somit genutzt werden um z.B. verschiedene Datenwerte miteinander zu vergleichen.

Der Bananenhash

Das hört sich zunächst etwas abstrakt an, darum wollen wir einmal einen eigenen Beispielhash entwickeln, bei dem wir uns nur auf Buchstaben beschränken. Ein einfacher Hash wäre es, jedem Buchstaben eine Zahl zuzuordnen (1-26 für A-Z), diese Werte miteinander zu multiplizieren und über 100 modulieren. Der Hash wird nun "Bananenhash" getauft. Der Bananenhash gibt nun für jeden Eingabewert einen Ausgabewert zwischen 0 und 100 aus. Aus dem Eingabewert "NIMIUS" würde somit 14 * 9 * 13 * 9 * 21 * 19 = 5,882,058 % 100 = 58. Der Eingabewert "NIMIUS" würde mit dem Bananenhash immer den Ausgabewert 58 erzeugen.
Eine Hashfunktion hat nur eine Richtung: Unser Hash erzeugt für "NIMIUS" zwar immer 58, jedoch können wir nicht von 58 auf NIMIUS kommen, da andere Werte auch diese Ausgabe erzeugen könnten (z.B. "SUIMIN" oder "USMINI").

Hashkollision

Erzeugen zwei Eingabewerte den selben Ausgabewert, so spricht man von einer Hashkollision. Eine Hashkollision kann fatal sein, wenn man sich darauf verlässt, dass alle Ausgabewerte einzigartig sind; Kann in einem kryptographischen Hash, der zur Datenverschlüsselung genutzt wird, eine Hashkollision erzwungen werden, so entstehen große Sicherheitsrisiken, da die Daten nicht mehr sicher sind. Hashkollisionen sind nicht komplett zu vermeiden, da Daten von beliebiger Größe auf einen kleinen Hash heruntergebrochen werden.
Die Wahrscheinlichkeit einer Hashkollision lässt sich dabei sehr einfach annähern:


wobei k die Anzahl der verschiedenen Werte ist, und N die Anzahl der möglichen Ausgabewerte.

Für unseren kleinen Hash bedeutet das, dass bei 15 erzeugten Hashes die Wahrscheinlichkeit einer Kollision bei etwas über 65% liegt, was den Gedanken nahe legt, dass unser Hash ziemlich Banane ist. Im Vergleich: Bei md5 läge die Wahrscheinlichkeit unter 15 Werten eine Hashkollision zu erzeugen bei 3.0856 * 10^-37. Um diesem Wert etwas Perspektive zu verleihen: 3*10^-37 des beobachtbaren Universum sind gerade einmal 0,27 nanometer.

Einsatzzwecke von Hashes

Hashes werden in vielen Bereichen eingesetzt: Ein Beispiel ist das Verarbeiten von Dateien, z.B. das Parsen von Markdown Files. Das Ergebnis kann mit einem Hash der Eingabedatei gesichert werden. So muss nicht bei jedem Request die Datei neu geparsed werden. Es reicht den Hash der Eingabedatei und den gesicherten Hash zu vergleichen, so lange es die Selben sind, kann die zwischengespeicherte Version gezeigt werden. Sind die Hashes unterschiedlich, so kann die Datei einmal neu geparsed werden, um anschließend wieder zwischengesichert vorzuliegen.

Ein anderes Beispiel ist das Speichern von Dateien mit ihrem Hash zusammen. Durch eine solche Methode lassen sich massenhafte Uploads einer Datei vermeiden, so kann für mehrere Uploads eine einzelne Datei genutzt werden, um Speicherplatz zu sparen.