ist der int-Wert des Strings.hashCode() einzigartig?
Stieß ich auf ein problem Tagen gemeldet.Jetzt habe ich zig-Millionen von Worten,die Art von string. jetzt habe ich entscheiden, zu halten Sie in der Datenbank und verwenden Sie einen index, um Sie zu halten einzigartig.Und ich will nicht zu vergleichen, die ursprünglichen Worte zu halten, die Sie einzigartig. Ich würde gerne sicherstellen, ob der hashCode () - Methode der string eindeutig sein kann , wird es nicht geändert werden, wenn ein benutzen Sie einen anderen laptop oder andere Zeit oder sowas?
- Nein, es ist deterministisch.
- Wie viele unterschiedliche Werte können hashCode zurückgeben? Wie viele verschiedene strings gibt es? GO!!! FIT-IN!
- Trotzdem, tldr; ist dies nicht geeignet, die Benutzung von hashCode. Während ein hash wie SHA-x nicht diese "Probleme" (oder besser: wir können behaupten, dass Kollisionen sind zu unwahrscheinlich, um zu kümmern), wenn nur der Vergleich von einzelnen Wörtern dann die hashes (20 bytes bei SHA-1) ist größer als die ursprüngliche Eingabe! Kein Sieg!
- Vorausgesetzt, RDBMS, fügen Sie
AUTO-INCREMENT
Feld auf Ihren Tisch, und es wird gefüllt werden mit eindeutigen Nummern beiINSERT
. - String ist hashCode ist definiert durch das String-API-Spezifikation so dass es erforderlich ist, werden die gleichen für gleiche strings Implementierungen.
- Danke, das wissen aktualisiert.
- Yup, ich Stimme mit Ihnen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unten ist die hashCode-Berechnung eine Zeichenkette, die eine JVM hat. Wie gesagt es rein berechnet, basierend auf den individuellen Charakter und seine position in der Zeichenfolge, und es gibt nichts, was abhängig ist von der JVM oder die Maschine geben, die läuft über die JVM, die würde alter der hashcode.
Dies ist auch einer der Gründe, warum die String-Klasse final deklariert (nicht erweiterbar, was zu der Unveränderlichkeit), so dass niemand ändert sein Verhalten.
Unten ist als pro-spec:-
Gibt einen hash-code für diese Zeichenfolge. Der hashCode für ein String-Objekt wird berechnet als
mit int-Arithmetik, wo
s[i]
ist das I-te Zeichen des Strings, n ist die Länge der Zeichenfolge, und ^ angibt, Potenzierung. (Der hash-Wert der leeren Zeichenkette ist null.)Einzigartig, keine. Von der Natur, hash-Werte sind nicht garantiert eindeutig sein.
Jedem system mit einer beliebig großen Anzahl von möglichen Eingaben und eine begrenzte Anzahl von Ausgängen haben Kollisionen.
So, werden Sie nicht in der Lage, einen einzigartige Datenbank-Schlüssel zu speichern, wenn es nur auf die hash-code. Sie können jedoch, verwenden Sie eine nicht-eindeutige Schlüssel zu speichern.
In der Antwort auf Ihre zweite Frage, ob die verschiedenen Versionen von Java erzeugen unterschiedliche hash-codes für die gleiche Zeichenfolge, Nein.
Sofern eine Java-Implementierung folgt in der Oracle-Dokumentation (sonst ist es nicht wirklich ein Java-Implementierung), wird konsistent in allen Implementierungen. Die Oracle docs für
- String.hashCode
angeben, eine Feste Formel für die Berechnung der hash:Möchten Sie vielleicht zu prüfen, ist dies immer noch der Fall, wenn Sie Wild disparate Versionen von Java (wie 1.2 vs 8), aber es ist so gewesen, dass für eine lange Zeit, mindestens seit 1.5.
Nein,
Weil ein string in java kann man die maximale und 2.147.483.647 (2^31 - 1) keine Zeichen und alle Zeichen variieren, so wird es produzieren eine sehr große keine Kombinationen, sondern ganze Zahl haben nur eine Reichweite von-2.147.483.648 bis 2.147.483.648 kommt. Es ist also unmöglich, und mit dieser Methode der hash-code eines Strings berechnet wird
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1].
Beispiel :
Wenn Sie zwei string-Variablen, wie "FB" und "Ea" gibt es hash-code wird das gleiche sein.