D’après le lien ci-dessous, je sais que Java utilise (hash & 0x7FFFFFFF) % tab.length
pour décider de l’emplacement d’un tableau dans lequel placer la {clé, valeur}.
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Hashtable.java#Hashtable.put%28java.lang.Object%2Cjava.lang. Objet% 29
Ma question est la suivante: pourquoi Java commence-t-il par le hachage & 0x7FFFFFFF? Y a-t-il un but particulier?
Parce que -1 % 10 == -1
que vous ne voulez certainement pas indexer dans un tableau. Forcer le bit de signe à 0 évite ce problème.
Car:
0x7FFFFFFF
est 0111 1111 1111 1111 1111 1111 1111 1111: tous 1 sauf le bit de signe.
(hash & 0x7FFFFFFF)
donnera un entier positif.
(hash & 0x7FFFFFFF) % tab.length
sera dans la plage de la longueur de l’onglet.
Notez que Hashtable
est plus ou moins obsolète et a été remplacé par HashMap
. Celui-ci utilise le hash & (table.length-1)
pour atteindre le même objective.
Il fait aussi un peu de changement avant, comme on peut le voir ici . Cela permet de faire face aux mauvaises implémentations de la hashCode()
qui renvoient des nombres avec une faible diversité.