web-dev-qa-db-fra.com

Boolean.hashCode ()

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?

113
user471011

1231 et 1237 ne sont que deux (suffisamment grands) nombres premiers arbitraires . Les deux autres grands nombres premiers feraient l'affaire.

Pourquoi les nombres premiers?
Supposons une seconde que nous choisissions des nombres composites (non premiers), disons 1000 et 2000. Lors de l'insertion de booléens dans une table de hachage, true et false irait dans le compartiment 1000 % N resp 2000 % N (où N est le nombre de compartiments).

Maintenant, remarquez que

  • 1000 % 8 même compartiment que 2000 % 8
  • 1000 % 10 même compartiment que 2000 % 10
  • 1000 % 20 même compartiment que 2000 % 20
  • ....

en d'autres termes, cela conduirait à de nombreuses collisions.

En effet, la factorisation de 1000 (23, 53) et la factorisation de 2000 (24, 53) ont tant de facteurs communs. Ainsi, les nombres premiers sont choisis, car il est peu probable qu'ils aient des facteurs communs avec la taille du godet.

Pourquoi grand nombres premiers. Les 2 et 3 ne feraient-ils pas l'affaire?
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. En outre, comme l'a souligné Drunix, une façon 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:

135
aioobe

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 (alias la douzaine du diable) - nombre malchanceux.

0
bvp