Pourquoi Java utilise-t-il (hash & 0x7FFFFFFF)% tab.length pour décider de l’index d’une clé?

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é.