Code incompris

Signaler
Messages postés
18
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
20 mai 2018
-
Messages postés
18
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
20 mai 2018
-
Bonjour, j'ai besoin que quelqu'un m'explique ce code que j'ai vu dans une méthode hasCode(). Il se peut que c'est une casting mais je ne comprends pas. Le code est le suivant:

int hash = 7;
hash = 23 * hash + (int) (Double.doubleToLongBits(this.surfaceArea) ^ (Double.doubleToLongBits(this.surfaceArea) >>> 32));
// je na comprends pas ceci >>> 32

2 réponses

Messages postés
15928
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 mai 2021
544
Bonjour
C’est un décalage de bit avec insertion de 0.
https://emmanuel-delahaye.developpez.com/tutoriels/c/operateurs-bit-bit-c/
Messages postés
16335
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 mai 2021
118
Bonjour,

Un double en Java est représenté en mémoire par 8 octets (64 bits).
Double.doubleToLongBits va récupérer chacun de ces bits et les stocker dans un long (64 bits aussi).
Par contre le hashCode attendu en Java est un int (4 octets = 32 bits).

x ^ (x >>> 32)
va permettre de faire un calcul entre les 32 premiers bits et les 32 derniers bits du long.
Le choix du
>>>
(au lieu de
>>
par exemple) étant de mettre à 0 les 32 premiers bits du long de résultat, ce qui permettra de ne garder que les 32 derniers bits et donc pouvoir le faire rentrer dans un int.

En simplifié (sur 16 bits), si tu as un nombre qui est représenté en interne par 10101010 11001100.
Le calcul qui est effectué c'est 10101010 ^ 11001100

Remarque : ton hashCode a été généré automatiquement par NetBeans. Et même si Eclipse fait plus ou moins pareil (mais avec 1 et 31 à la place des 7 et 23), ça ne veut pas dire que c'est la seule manière de faire.

La valeur exacte d'un hashCode pour un objet n'a aucune importance, ce qui compte ce sont ses propriétés :
  • si deux objets ont des hashCode différents alors ils sont différents
  • si deux objets sont égaux alors ils ont le même hashCode

Tu pourrais donc très bien faire ton propre calcul de hashCode, que tu comprendrais mieux, du moment que ces propriétés sont respectés. Exemple tout simple :
int hash = (int) surfaceArea;

Ce hashCode est tout à fait correct... mais il n'est pas "très bon" car il y aura souvent le même hashCode pour des objets différents, car on n'a pas pris en compte les nombres après la virgule.
Messages postés
18
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
20 mai 2018

Merci à KX et à Whismeril elles sont compléméntaires vos réponses et j'au vraiment compris. Merci encore.