Java hashcode
-
Hallo,
jedes Objekt in Java hat eine hashcode() Funktion. Sie liefert einen HashCode fuer das Objekt zurueck. Wie das funktioniert weiss ich nicht. Hat eine klasse eine string variable und eine int variable , wird wahrscheinlich vom String jeder Buchstabe als ASCII genommen und mit einem Wert multipliziert und dann addiert. Der int wird einfach addiert.
Auf wikipedia wird ganz unten eine hash funktion fuer einen STring vorgestellt. Es handelt sich um eine Produktsumme. Meine Frage nun. Soviel ich weiss sollte ein Hash Wert nur maximal gross sein. z.B. 32 bit. Bei der verwendeten Funktion in wikipedia waechst der Hashwert je laenger der String ist. grundsaetzlich kann der Hashwert unendlich gross werden. Das sollte doch nicht sein...
-
sorrry hier nochmal der wiki link
-
sorry der bei dem link muesst ihr die Klammern mitkopieren !
-
PJPower schrieb:
Hallo,
jedes Objekt in Java hat eine hashcode() Funktion. Sie liefert einen HashCode fuer das Objekt zurueck. Wie das funktioniert weiss ich nicht.
Sowas kann man nachgucken. Z.B. auf http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/String.java#l1452
Auf wikipedia wird ganz unten eine hash funktion fuer einen STring vorgestellt. Es handelt sich um eine Produktsumme. Meine Frage nun. Soviel ich weiss sollte ein Hash Wert nur maximal gross sein. z.B. 32 bit. Bei der verwendeten Funktion in wikipedia waechst der Hashwert je laenger der String ist. grundsaetzlich kann der Hashwert unendlich gross werden. Das sollte doch nicht sein...
https://en.wikipedia.org/ schrieb:
where terms are summed using Java 32-bit int addition
Es können also immer nur 32bit-Werte rauskommen, alles da drüber wird abgeschnitten (overflow)
-
aber bei dieser Hash Funktion frag ich mich ja schon , ob es da ganz schnell mal passieren kann, dass 2 eigentlich verschiedene Strings dann den selben hash Wert haben. z.B. sowas hier : but - tub , so woerter mit den gleichen Buchstaben...
public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }
-
PJPower schrieb:
aber bei dieser Hash Funktion frag ich mich ja schon , ob es da ganz schnell mal passieren kann, dass 2 eigentlich verschiedene Strings dann den selben hash Wert haben.
Das ist bei jeder Hashfunktion der Fall, da es mehr unterschiedliche Strings als int-Werte gibt.
Die hier angegebene Funktion liefert für deine Beispiel-Strings übrigens nicht denselben Wert.
-
ja stimmt. Da kommt was anderes raus. Ich beherrsche die einfachsten Grundrechenarten nicht