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?
131
demandé sur Frederik Struck-Schøning 2008-09-19 19:20:45

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.

143
répondu Nick Johnson 2008-09-19 16:33:40

Ben est correct, reflétant L'Assemblée vous pouvez voir que c'est juste un nombre premier qu'ils ont choisi d'utiliser.

15
répondu Nick Craver 2008-09-19 15:27:41

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 .

9
répondu kybernetikos 2015-12-08 22:43:10