Ich war für meine Datenstrukturen Abschlussprüfung überprüfen, und ich stieß auf eine Frage im Finale des vergangenen Jahres. Nachdem ich in den letzten drei Stunden daran gearbeitet hatte, konnte ich immer noch keine Lösung finden, außer durch Versuch und Irrtum. Hier ist die Frage:Kollisionen in Hash-Tabelle finden
„Nehmen wir an, dass die Größe der Hash-Tabelle 31 ist die Konstante g ist auch 31, und dass Sie verwenden, um den folgenden Hash-Code
int hash = 0;
int n = s.length();
for (int i = 0; i < n; i++)
hash = g * hash + s.charAt(i);
und dass Sie separate Verkettungs verwenden zu lösen Kollisionen. Listen Sie fünf verschiedene Namen auf, die zum selben Ort in der Tabelle hashen würden. "
Ich denke, es muss eine Art von Tricks, möglicherweise mit dem Modulo-Operator, um dieses Problem zu lösen, unter Berücksichtigung der Größe der Hash-Tabelle ist 31, die die Konstante g gleich ist. Entschuldigung, wenn ich so aussehe, aber ich frage nicht nach Code oder irgendetwas, nur ein paar Gedanken/Hinweise zu der Frage. Jeder Kommentar wird sehr geschätzt. Dank
Interessant! Vielen Dank, dass Sie darauf hingewiesen haben. –
Gut zu helfen ... –
BTW, diese Implementierung von Hashing lässt Java offen für einen DoS-Angriff! Siehe http://www.ocert.org/advisories/ocert-2011-003.html, http://cryptanalysis.eu/blog/2011/12/28/effective-dos-attacks-against-web-application-plattforms -Hashdos/oder Google für DoS-Angriffe mit Hash-Karten. – yshavit