Bitte denken Sie daran, wie eine Hash-Tabelle (in jeder Sprache ...) tatsächlich Werke: "Eimers" es eine besteht (in der Regel, Prime) Anzahl des Der Zweck der Hash-Funktion besteht einfach darin, jeden eingehenden Schlüsselwert in eine Bucket-Nummer umzuwandeln. (Das Worst-Case-Szenario besteht immer darin, dass 100% der eingehenden Schlüssel in einem einzigen Bucket aufgehen und Sie mit einer "verknüpften Liste" belassen.) Sie bemühen sich einfach, eine Hash-Funktion zu entwickeln, die "normalerweise" erzeugt eine "weit verstreut" Verteilung von Werten, so dass, wenn berechnet Modulo die (Prime ...) Anzahl der Eimer, "die meiste Zeit, die meisten der Eimer" wird "mehr oder weniger gleichermaßen" gefüllt. (Aber denken Sie daran: Sie nie sicher sein kann.)
„Collisions“ sind völlig zu erwarten: in der Tat, „sie die ganze Zeit passieren.“
In meiner bescheidenen Meinung "überdenken" Sie die Hash-Funktion: Ich sehe keinen zwingenden Grund, Math.pow()
überhaupt zu verwenden. Erwarten Sie, dass jeder von Ihnen erzeugte Wert in eine Hash-Bucket-Nummer umgewandelt wird, indem der absolute Wert modulo die Anzahl der Buckets genommen wird. Der beste Weg, um zu sehen, ob Sie einen guten (für Ihre Daten ...) haben, ist die beobachtete Verteilung der Bucket-Größen zu beobachten. (Ist es "gut genug" für Ihre Zwecke noch?)
'Math.pow (...)' gibt ein Doppel. Kompiliert das? –
Es kompiliert, ja –
Die Java-String-hashCode-Implementierung verwendet 'Math.pow' nicht, sondern verwendet int math und ermöglicht, dass ein int-Überlauf Teil der Berechnung ist. Ihre Berechnung nicht, und das ist ein großer Unterschied. –