Doppel-Hashing

Aus testwiki
Zur Navigation springen Zur Suche springen

Beim Doppelstreuwertverfahren oder Doppel-Hashing (Vorlage:EnS) handelt es sich um eine Methode zur Realisierung eines geschlossenen Hash-Verfahrens. In geschlossenen Hash-Verfahren wird versucht, Überläufer in der Hash-Tabelle unterzubringen, anstatt sie innerhalb der Zelle (z. B. als Liste) zu speichern. (Offene Hash-Verfahren können Einträge doppelt belegen und benötigen daher keine Sondierung.) Achtung: Wie es im Artikel Hashtabelle unter „Varianten des Hashverfahrens“ steht, werden die Bezeichnungen „offenes“ bzw. „geschlossenes Hashing“ auch in genau umgekehrter Bedeutung verwendet.

Um dies umzusetzen, verwendet man beim Doppel-Hashing eine Sondierungsfunktion, die eine sekundäre Hash-Funktion beinhaltet, z. B. s(j,k):=jh(k), und die angewendet wird, falls der durch die primäre Hash-Funktion h(k) berechnete Index bereits besetzt ist.

Die vollständige Hash-Funktion lautet dann: h(k)s(j,k), wobei j die Anzahl bereits „ausprobierter“ Indizes ist, d. h., dass j jedes Mal um 1 erhöht wird, wenn ein Index bereits belegt ist.

Die Sondierungsfunktion s(j,k) soll dabei eine Permutation der Indizes der Hash-Tabelle bilden.

Die Folge von Hash-Funktionen, die nun mittels h und h gebildet werden, sieht so aus:

hj(k)=(h(k)+h(k)j)modm

Die Kosten für diese Methode sind nahe den Kosten für ein ideales Hashing.

Unabhängigkeit der Hashfunktionen

Beim Doppel-Hashing werden zwei unabhängige Hash-Funktionen h und h angewandt. Diese heißen unabhängig, wenn die Wahrscheinlichkeit für eine sogenannte Doppelkollision, d. h. h(k)=h(y)h(k)=h(y), kleiner gleich 1/m2 und damit minimal ist, wobei m die Größe des Arrays ist.

Beispiele

Beispielfunktionen

Größe des Arrays: m

Indizes: {0; m-1}

Primäre Hash-Funktion: h(k):=kmodm (Divisions-Rest-Methode)

Sekundäre Hash-Funktion: h(k):=kmod(m2)+1

Sondierungsfunktion: s(j,k):=j(kmod(m2)+1)

Vollständige Doppel-Hash-Funktion: hj(k):=(kmodm+j(kmod(m2)+1))modm

Berechnungsbeispiel

Größe des Arrays: m = 7

Hashfunktionen
h(k):=kmod7
h(k):=kmod5+1
Sondierungsfunktion
hj(k):=(h(k)+jh(k))modm

Hashtabelle:

k 10 19 31 22 14 16
h 3 5 3 1 0 2
h' 1 5 2 3 5 2

Das mit Hilfe von Hashtabelle und Sondierungsfunktion gefüllte Array:

0 1 2 3 4 5 6
31 22 16 10 - 19 14

Erklärung am Beispiel k=31:

k=10 sowie k=19 erzeugen keine Kollision und benötigen deshalb nicht die Doppel-Hash-Funktion hj. Der Index der Hash-Funktion h kann hier abgelesen werden. k=31 erzeugt eine Kollision im Array an der Stelle 3 , weshalb man nun die Doppel-Hash-Funktion hj mit j=1:

h1(31)=(h(31)+1h(31))mod7(3+12)mod75mod75

Die Stelle 5 erzeugt wieder eine Kollision, weshalb hj nun mit j=2 aufgerufen wird:

h2(31)=(h(31)+2h(31))mod7(3+22)mod77mod70

Die Stelle 0 ist frei und erhält somit den Inhalt 31.