La hashCode()
méthode 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?
La hashCode()
méthode 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?
Réponses:
1231 et 1237 ne sont que deux nombres premiers arbitraires (suffisamment grands) . Tout autre grand nombre premier ferait l'affaire.
Pourquoi des nombres premiers?
Supposons pendant une seconde que nous ayons choisi des nombres composites (non premiers), disons 1000 et 2000. Lors de l'insertion de booléens dans une table de hachage, vrai et faux iraient 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 .
C'est parce que 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 il est peu probable qu'ils aient des facteurs communs avec la taille du seau.
Pourquoi de grands nombres premiers. Est-ce que 2 et 3 ne feraient pas?
Lors du calcul des codes de hachage pour les objets composites, il est courant d'ajouter les codes de hachage pour les composants. Si des valeurs trop petites sont utilisées dans un ensemble de hachage avec un grand nombre de compartiments, il y a un risque de se retrouver avec une distribution inégale des objets.
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 objets. De plus, comme l'a souligné Drunix, une manière courante de créer des fonctions de hachage d'objets composites consiste à réutiliser les implémentations de code de hachage des sous-composants, auquel cas il est bon de renvoyer de grands nombres premiers.
Questions connexes:
2*1231 = 2462
seaux. Les collisions sont-elles un problème dans une telle situation?
En plus de tout ce qui est dit ci-dessus, il peut également s'agir d'un petit œuf de Pâques des développeurs:
vrai: 1231 => 1 + 2 + 3 + 1 = 7
7 - est un chiffre porte-bonheur dans les traditions européennes;
faux: 1237 => 1 + 2 + 3 + 7 = 13
13 (aka la douzaine du diable) - nombre malchanceux.