Rehasing: Was ist, wenn es den Hash auch schon gibt?

3 Antworten

immer weiter hashen


Ich gehe davon aus, dass du von einer Art Hashmap redest?

Wenn ja, hast du da etwas missverstanden.

Man nutzt Rehashing NICHT wenn es zu Kollisionen kommt, sondern wenn ein sog. Loadfactor überschritten ist.

Für eine Hashmap mit nur 5 Buckets wäre das hier völlig OK und noch kein Grund zum rehashen:

0: foo, bar, baz
1:
2:
3: qux
4:

Wenn du von einer perfekten Hashmap ohne Kollisionen ausgehst, kannst du lange rehashen und dabei tonnenweise sinnlos Speicher verbraten.

Es gibt aber Werkzeuge, die dir für einen bestimmten Satz an Objekten einen perfekten Hashalgorithmus (bzw. IV) generieren, aber das dauert bei großen Datenmengen gerne mal mehrere Stunden und ist sowieso nur in Sonderfällen notwendig.

Beim Hashen musst du immer mit Kollisionen rechnen. Und diese können natürlich auch mehrfach bzw. wiederholt auftreten.

Ein Problem ist das i. d. R. aber nicht. :)

Woher ich das weiß:Berufserfahrung

helpmewismath 
Fragesteller
 14.07.2020, 19:03

Ja ich meine eine Hashmap :)

Also wir haben eben 3 Möglichkeiten gelernt, Kollisionen zu handlen

Dein 0er Hash würde ja Chaining verwenden, aber angenommen ich muss in der Prüfung halt mit Rehashing arbeiten.

0:
1:foo
2:
3:bar
4:

jetzt will ich baz einfügen: hash(baz) = 1, rehash(baz) = 2

Sowohl 1 als auch 3 sind belegt. Wie geht es nun weiter?

0
uchimuchipuchi  14.07.2020, 19:17
@helpmewismath

Solange rehashen, bis es keine Kollisionen mehr gibt.

Das führt aber potentiell zu Endlosschleifen, also sei in der Praxis bitte sehr vorsichtig, falls du so etwas implementieren solltest. :)

1
helpmewismath 
Fragesteller
 14.07.2020, 19:18
@uchimuchipuchi

Alles klar, danke! Also würde ich hier immer 2er Schritte vorwärts machen und wenn ich unten bin wieder oben los legen. Hier würde ich dann bei der 0 landen?

0

Cuckoohashing?

Das wäre zumindest ad hoc das einzige, was mit mit Rehashing einfiele...