Warum hat Sun die Implementierung von String.hashCode () angegeben?

8

Es scheint eine anhaltende Debatte darüber zu geben, ob es sicher ist, sich auf die derzeitige Umsetzung von String.hashCode() zu verlassen, da dies technisch gesehen durch die Spezifikation (Javadoc) garantiert wird.

  1. Warum hat Sun die Implementierung von String.hashCode() in der Spezifikation spezifiziert?
  2. Warum sollten sich Entwickler jemals auf eine spezifische Implementierung von hashCode () verlassen?
  3. Warum hat Sun Angst, dass der Himmel fallen wird, wenn String.hashCode() in der Zukunft geändert wird? (Dies wird wahrscheinlich durch # 2 erklärt)
Gili 12.02.2010, 22:57
quelle

2 Antworten

8

Ein Grund dafür, sich auf die spezifische Implementierung von hashCode () zu verlassen, wäre, wenn es jemals in einer Datenbank, Datei oder irgendeinem anderen Speichermedium gespeichert wird. Schlechte Dinge (tm) würden passieren, wenn die Daten zurückgelesen würden, wenn sich der Hash-Algorithmus geändert hätte. Sie könnten auf unerwartete Hash-Kollisionen stoßen, und noch beunruhigender ist die Unfähigkeit, etwas durch seinen Hash zu finden, da sich der Hash zwischen den Daten geändert hat, die persistent und "jetzt" sind.

Tatsächlich erklärt das ziemlich genau Punkt # 3 =)

Der Grund für Punkt # 1 könnte "Interoperabilität" sein. Wenn die hashCode-Implementierung gesperrt ist, können Daten zwischen verschiedenen Implementierungen von Java ziemlich sicher geteilt werden. D. h., der Hash eines gegebenen Objekts wird unabhängig von der Implementierung immer gleich sein.

    
Rob 12.02.2010, 23:00
quelle
4

Die Implementierung hat seit der ursprünglichen String -Klasse geändert. Wenn ich mich erinnere, war es früher so, dass nur jedes 16. (?) Zeichen im Hash für "lange" Zeichenfolgen verwendet wurde.

Es wurde möglicherweise angegeben, die Serialisierungsinteroperabilität zwischen nachfolgenden Versionen von Java oder sogar zwischen den Laufzeiten verschiedener Anbieter zu fördern. Ich stimme zu, ein Programmierer sollte sich nicht direkt auf eine bestimmte Implementierung von hashCode() verlassen, aber das Ändern könnte möglicherweise ein Los von serialisierten Sammlungen zerstören.

    
erickson 12.02.2010 23:06
quelle