Frage

Eine interessante Frage kam vor kurzem auf. Wir stießen auf einige Code, der hashCode() als Salzquelle für MD5-Verschlüsselung verwendet, aber es stellt sich die Frage: hashCode() den gleichen Wert für das gleiche Objekt auf verschiedenen VMs, verschiedene JDK-Versionen und Betriebssysteme zurückkehren? Auch wenn es hier nicht garantiert, hat es bis jetzt an jedem Punkt geändert?

EDIT:. Ich meinen String.hashCode() wirklich eher als die allgemeinere Object.hashCode(), was natürlich außer Kraft gesetzt werden kann

War es hilfreich?

Lösung

Nein. Aus http://tecfa.unige.ch/guides/java/ langspec-1.0 / javalang.doc1.html :

  

Der allgemeine Vertrag von hashCode ist als   folgt:

     
      
  • Jedes Mal, wenn es während eines auf das gleiche Objekt mehr als einmal aufgerufen wird,   Ausführung einer Java-Anwendung,   hashCode muss die konsequent zurückkehren   gleiche ganze Zahl ist. Die ganze Zahl kann   positiv, negativ oder Null ist. Diese   integer nicht der Fall, müssen jedoch   konsistent bleiben von einem Java   Anwendung zu einer anderen oder von einem   Ausführung einer Anwendung zu einer anderen   Ausführung der gleichen Anwendung.   [...]
  •   

Andere Tipps

Es hängt von der Art:

  • Wenn Sie einen Typen haben, die hashCode nicht außer Kraft gesetzt hat (), dann wird es wahrscheinlich eine andere hashCode () zurückgeben jedes Mal, wenn Sie das Programm ausführen.
  • Wenn Sie einen Typ haben, die überschreibt hashCode (), aber nicht dokumentiert, wie sie berechnet ist, ist es vollkommen legitim, dass ein Objekt mit den gleichen Daten auf jedem Lauf einen anderen Hash zurück, solange es das gleiche zurück Hash für wiederholte Anrufe innerhalb der gleichen Lauf.
  • Wenn Sie einen Typ haben, die hashCode () in einer Art und Weise dokumentiert außer Kraft gesetzt, das heißt der Algorithmus Teil des dokumentierten Verhalten ist, dann sind Sie wahrscheinlich sicher. (Java.lang.String dokumentieren diese, zum Beispiel.) Allerdings würde ich noch meiden verlassen auf diese auf grundsätzlich persönlich.

Nur ein warnendes Beispiel aus der .NET-Welt: Ich habe durch Verwendung des Ergebnisses von string.GetHashCode () als ihr Passwort-Hash in einer Datenbank zumindest ein paar Menschen in einer Welt des Schmerzes gesehen. Der Algorithmus verändert zwischen .NET 1.1 und 2.0, und plötzlich alle Hashes sind „falsch“. (Jeffrey Richter dokumentiert einen fast identischen Fall in CLR via C #). Wenn ein Hash hat gespeichert werden müssen, würde ich es vorziehen, sie in einer Weise berechnet werden, das ist immer garantiert stabil sein - zB MD5 oder eine benutzerdefinierte Schnittstelle für Ihre Typen mit einer Garantie von Stabilität umgesetzt werden.

Nach dem docs : der Hash-Code für ein String-Objekt wird berechnet als

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

Ich bin nicht sicher, ob dies eine formale Spezifikation ist oder nur Suns Implementierung. Zumindest sollte es das gleiche auf allen vorhandenen Sun VMs, unabhängig von der Plattform oder Betriebssystem sein.

Nein. Hash-Algorithmen sind nicht garantiert, sofern nicht anders angegeben. So müssen zum Beispiel Deserialisation von Hash-Strukturen Hash-Codes neu zu berechnen und diese Werte sollten nicht in der serialisierten Form gespeichert werden.

Ich möchte hinzufügen, dass Sie hashCode überschreiben können () (vergessen Sie nicht, equals (), wenn Sie das tun), um Ihre Business-Objekte geben den gleichen hashCode überall sicher. Diese Objekte werden dann zumindest eine vorhersagbare hashCode haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top