24 votes

Java Object.hashCode() - adresse ou aléatoire?

Je suis en train de chercher à comprendre l'implémentation native de la méthode hashCode(). Que retourne exactement cette méthode? Est-ce une adresse mémoire ou une valeur aléatoire?

40voto

zvdh Points 3335

.hashCode() implémentation native dépend de la JVM.

Par exemple, HotSpot a 6 implémentations de Object.hashCode(). Vous pouvez le choisir en utilisant le drapeau -XX:hashCode=n en exécutant la JVM via la ligne de commande, où n :

0 - Park-Miller RNG (par défaut)
1 - f(address, global_statement)
2 - constante 1
3 - Compteur série
4 - Adresse d'objet
5 - Xorshift Thread-local

22voto

Jon Skeet Points 692016

De la documentation:

Dans la mesure du possible, la méthode hashCode définie par la classe Object renvoie des entiers distincts pour des objets distincts. (Cela est généralement implémenté en convertissant l'adresse interne de l'objet en entier, mais cette technique d'implémentation n'est pas requise par le langage de programmation JavaTM.)

Il se peut donc qu'il soit lié à une adresse mémoire, mais ce n'est pas obligatoire - et vous ne devez surtout pas supposer qu'il est lié à la mémoire en aucune façon.

Rien de ce que vous faites avec un code de hachage ne devrait se soucier de cela. Les seules choses que vous devriez déduire des codes de hachage sont:

  • Si les codes de hachage de deux objets sont les mêmes, ils peuvent être des objets égaux
  • Si les codes de hachage de deux objets sont différents, ce ne sont pas des objets égaux (en supposant une implémentation correcte, qu'elle soit redéfinie ou non)

3voto

The New Idiot Points 23130

Votre réponse se trouve ici. Comme mentionné dans la documentation :

Autant que possible, la méthode hashCode définie par la classe Object retourne des entiers distincts pour des objets distincts. (Cela est généralement implémenté en convertissant l'adresse interne de l'objet en un entier, mais cette technique d'implémentation n'est pas requise par le langage de programmation JavaTM).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X