130 votes

Boolean.hashCode()

Le site hashCode() de la classe Boolean est implémentée comme suit :

public int hashCode() {
    return value ? 1231 : 1237;
}

Pourquoi utilise-t-il 1231 et 1237 ? Pourquoi pas autre chose ?

1 votes

Ces deux nombres sont des nombres premiers suffisamment grands. Veuillez lire le article sur les tables de hachage sur Wikipedia pour plus d'informations.

152voto

aioobe Points 158466

1231 et 1237 sont juste deux (suffisamment grands) des nombres premiers arbitraires . N'importe quels autres deux grands nombres premiers feraient l'affaire.

Pourquoi des primes ?
Supposons une seconde que nous choisissions des nombres composites (non primaires), disons 1000 et 2000. Quand on insère des booléens dans une table de hachage, vrai et faux irait dans le seau 1000 % N resp. 2000 % N (où N est le nombre de godets).

Maintenant, remarquez que

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

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

Ceci est dû au fait que la factorisation de 1000 (2 3 , 5 3 ) et la factorisation de 2000 (2 4 , 5 3 ) ont autant de facteurs communs. On choisit donc des nombres premiers, car il est peu probable qu'ils aient des facteurs communs avec la taille du seau.

Pourquoi grand site primes. 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 des composants. Si des valeurs trop petites sont utilisées dans un ensemble de hachage comportant un grand nombre de godets, on risque de se retrouver avec une distribution inégale des objets.

Les collisions sont-elles importantes ? Les booléens ont simplement deux valeurs différentes de toute façon ?
Les cartes peuvent contenir des booléens ainsi que d'autres objets. De plus, comme l'a fait remarquer Drunix, une façon courante de créer des fonctions de hachage d'objets composites consiste à réutiliser les implémentations de codes de hachage des sous-composants, auquel cas il est bon de renvoyer de grands nombres premiers.

Questions connexes :

0 votes

why not other large prime nos used? Voici la liste de tous les premiers non ? mindprod.com/jgloss/primes.html moins de 10.000, pouvez-vous s'il vous plaît expliquer ceci

1 votes

Je suppose que ceux-ci sont suffisamment grands. Pour obtenir un pgcd supérieur à 1, il faudrait au moins 2*1231 = 2462 seaux. Les collisions posent-elles un problème dans une telle situation ?

2 votes

Il est intéressant de noter qu'ils ne sont pas vraiment "assez grands" compte tenu de ce qui peut tenir dans un int. Je suppose qu'ils sont juste assez grands pour bien fonctionner avec la table de hachage du JDK, mais encore assez petits pour minimiser les coûts de calcul.

4voto

Boris Pavlović Points 22207

Ces deux nombres sont des nombres premiers suffisamment grands. Veuillez lire le article sur les tables de hachage sur Wikipedia pour plus d'informations.

3voto

bvp Points 29

En plus de tout ce qui a été 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) - numéro malchanceux.

0voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X