Mithilfe einer Hashfunktion kann für einen Schlüssel eine Speicheradresse in einem Array berechnet werden und der Wert dann an der Stelle gespeichert werden.

  • Problem: Balance zwischen Speicherplatz und Komplexität der Suche

Eigenschaften

  • Jedes Paar mit und ist eine Kollision
  • ist perfekt, falls sie niemals Kollisionen verursacht
  • ist gleichverteilt (“ideal”) falls für alle
  • ist ordnungserhaltend genau dann wenn
  • Hashfunktionen sollten effizient berechenbar sein
  • Hashfunktionen sollten speichereffizient sein (𝑀 sollte so klein wie möglich sein)

Hashfunktionen

Modulares Hashing

Für ist eine einfache und überraschend gute Hashfunktion

In der Praxis hat eine Primzahl für weniger Kollisionen als eine Zweierpotenz bzw. jede zusammengesetzte Zahl für .

Multiplikativer Hash

Idee: Benutze eine rationale Zahl , die eine lange Periodizität besitzt

  • agiert als Pseudo-Zufallsgenerator in .

Häufig verwendet: Goldener Schnitt .

Hashfunktionen für Zeichenketten

  • Summe der ASCII- oder Uni-Codes (Achtung: Kollisionen)
  • Gewichtung nach Position in der Zeichenkette (im Prinzip Stelllenwertsystem)
  • Zobrist-Hash: Wenn Zeichenketten gleich lang, generiere Zufallscode für jede einzelne Kombination aus Zeichen und Position und berechne dann XOR aus den vorhandenen Codes:
    • Wird in Computerbrettspielen benutzt, um die Stellung mit 64-bit zu speichern

Kollisionen

  • keine Ausnahme, sondern die Regel (siehe Geburtstagsparadoxon)

Verfahren zur Kollisionsbehandlung

Overflow Hashing / chaining: Kollisionen werden außerhalb vom Feld gespeichert (verkettete Listen)

  • Separate Verkettung (separate chaining): in A[i] steht ein Tupel (k, p) aus initialem Schlüssel und einem Pointer auf die Liste, der kollidierenden Schlüssel
    • sinnvoll bei wenigen Kollisionen / kleinen Schlüsseln
  • Direkte Verkettung (sequential chaining): in A[i] steht immer ein Pointer auf eine Liste aller Schlüssel
    • sinnvoll bei häufigen Kollisionen

Closed Hashing / probing: Kollisionen werden innerhalb vom Feld gespeichert
Dynamisches Hashing: Kollisionen werden innerhalb vom Feld gespeichert, welches seine Größe verändern kann

Lineares Sondieren

Kein zusätzlicher Speicher soll benutzt werden

Idee: verwende nächste freie Stellen in Hashtabelle

  • Achtung: beim Löschen muss spezielles Symbol hinterlassen werden, damit über die nun leere Stelle hinaus gesucht werden kann

Bloom-Filter

  • Ziel ist nicht, den Wert zum Schlüssel zu finden, sondern nur zu prüfen, ob dieser Schlüssel enthalten ist. (Liste aus Wörtern)
  • Idee: Baue Hashtabelle und nutze um zu markieren, ob ein Schlüssel in ist oder nicht.
    • 0: nicht enthalten (logisch abgesichert)
    • 1: enthalten (logisch nicht abgesichert, aufgrund von Kollisionen)
  • Verbesserung: Die Verwendung mehrerer unabhängiger, gleichverteilter Hashfunktionen mit gleicher Eingabe und auf demselben -Array verringert die Wahrscheinlichkeit zufälliger Kollisionen
    • nicht enthalten, wenn mindestens eine
    • verbleibende falsch-positiv-Rate: approximativ mit Füllrate
    • nicht zu viele Hashfunktionen, sonst zu viele -Einträge und damit hohe falsch-positiv-Rate