Question

Il semble y avoir un débat pour savoir s'il est sûr de compter sur la mise en œuvre actuelle de String.hashCode() parce que, techniquement parlant, il est garanti par la spécification (Javadoc).

  1. Pourquoi Sun précise la mise en œuvre de String.hashCode() dans la spécification?
  2. Pourquoi les développeurs jamais besoin de compter sur une mise en œuvre spécifique de hashCode ()?
  3. Pourquoi est-Sun tellement peur que le ciel tombera si String.hashCode() est changé à l'avenir? (Ceci est probablement être expliqué par # 2)
Était-ce utile?

La solution

Une raison de s'être fondée sur la mise en œuvre spécifique de hashCode () serait si elle est toujours persisté à une base de données, un fichier ou tout autre support de stockage. Bad Things (tm) se passerait-il si les données ont été relue lorsque l'algorithme de hachage avait changé. Vous pouvez rencontrer des collisions de hachage inattendues, et plus inquiétant encore, l'incapacité de trouver quelque chose par son hachage parce que le hachage a changé entre les données ont persisté et « maintenant ».

En fait, cette jolie explique beaucoup de point # 3 trop =)

La raison pour le point # 1 pourrait être « pour permettre l'interopérabilité ». Si la mise en œuvre de hashCode est verrouillé alors les données peuvent être partagées entre les différentes implémentations de Java tout à fait en toute sécurité. i.e., le hachage d'un objet donné sera toujours la même, quelle que soit la mise en œuvre.

Autres conseils

La mise en œuvre a changé depuis la classe String d'origine. Si je me souviens, il était autrefois que seul chaque caractère 16 (?) A été utilisé dans le hachage pour les chaînes « longues ».

Il peut avoir été spécifiée pour promouvoir l'interopérabilité de sérialisation entre les versions ultérieures de Java, ou même entre les runtimes de différents fournisseurs. Je suis d'accord, un programmeur ne doit pas compter sur une mise en oeuvre particulière hashCode() directement, mais le changer pourrait casser une beaucoup de collections sérialisés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top