2016-07-25 9 views
1

Versuch, meine eigene Hash-Funktion in Java zu schreiben. Ich bin mir bewusst, dass dies das gleiche ist, das Java implementiert, aber ich wollte es selbst testen. Ich bekomme Kollisionen, wenn ich verschiedene Werte eingib und mir nicht sicher bin warum.Java Hash Funktion Kollision

public static int hashCodeForString(String s) { 
int m = 1; 
int myhash = 0; 
    for (int i = 0; i < s.length(); i++, m++){ 
    myhash += s.charAt(i) * Math.pow(31,(s.length() - m)); 
    } 
return myhash; 
} 
+0

'Math.pow (...)' gibt ein Doppel. Kompiliert das? –

+0

Es kompiliert, ja –

+1

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. –

Antwort

2

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?)