Pourquoi ' 397 ' est-il utilisé pour ReSharper GetHashCode override?
Comme beaucoup d'entre vous, j'utilise ReSharper pour accélérer le processus de développement. Lorsque vous l'utilisez pour outrepasser les membres d'égalité d'une classe, le code-gen qu'il produit pour GetHashCode() ressemble à:
public override int GetHashCode()
{
unchecked
{
int result = (Key != null ? Key.GetHashCode() : 0);
result = (result * 397) ^ (EditableProperty != null ? EditableProperty.GetHashCode() : 0);
result = (result * 397) ^ ObjectId;
return result;
}
}
bien sûr que j'ai quelques-uns de mes propres membres là-dedans, mais ce que je veux savoir c'est pourquoi 397?
- EDIT: donc ma question serait mieux formulée comme, y a-t-il quelque chose de "spécial" au sujet du nombre premier 397 en dehors de celui-ci étant un nombre premier?
3 réponses
probablement parce que 397 est un premier de taille suffisante pour faire déborder la variable de résultat et mélanger les bits du hash un peu, fournissant une meilleure distribution des codes de hash. Il n'y a rien de spécial dans le 397 qui le distingue des autres nombres premiers de la même magnitude.
Ben est correct, reflétant L'Assemblée vous pouvez voir que c'est juste un nombre premier qu'ils ont choisi d'utiliser.
le hash que resharper utilise ressemble à une variante du FNV hash. La FNV est souvent mise en œuvre avec différents nombres premiers. Il y a une discussion sur le choix approprié de nombres premiers pour FNV ici .