La méthode hashCode () de la classe Boolean est implémentée comme ceci:
public int hashCode() { return value ? 1231 : 1237; }
Pourquoi utilise-t-il 1231 et 1237? Pourquoi pas autre chose?
1231 et 1237 ne sont que deux nombres premiers arbitraires (suffisamment grands). Tous les deux autres grands nombres premiers feraient bien.
Pourquoi premiers?
Supposons pendant un instant que nous avons choisi des nombres composites (non premiers), disons 1000 et 2000. Lorsque vous insérez des booléens dans une table de hachage, true et false entrent dans le compartiment 1000 % N
resp 2000 % N
(où N
est le nombre de compartiments) ).
Maintenant remarquez que
1000 % 8
même seau que 2000 % 8
1000 % 10
même seau que 2000 % 10
1000 % 20
même seau que 2000 % 20
en d’autres termes, cela conduirait à de nombreuses collisions .
En effet, la factorisation de 1000 (2 3 , 5 3 ) et la factorisation de 2000 (2 4 , 5 3 ) ont autant de facteurs communs. Ainsi, les nombres premiers sont choisis, car ils sont peu susceptibles d’avoir des facteurs communs avec la taille du godet.
Pourquoi les grands nombres premiers? Ne serait-ce pas 2 et 3?
Lors du calcul des codes de hachage pour les objects composites, il est courant d’append les codes de hachage pour les composants. Si des valeurs trop petites sont utilisées dans un ensemble de hachage comportant un grand nombre de compartiments, il existe un risque de voir la dissortingbution inégale des objects.
Les collisions sont-elles importantes? Les booléens ont juste deux valeurs différentes de toute façon?
Les cartes peuvent contenir des booléens avec d’autres objects. En outre, comme l’a souligné Drunix, une manière courante de créer des fonctions de hachage d’objects composites consiste à réutiliser les implémentations de code de hachage des sous-composants, auquel cas il est bon de renvoyer les grands nombres premiers.
Questions connexes: