web-dev-qa-db-fra.com

Pourquoi «397» est-il utilisé pour la substitution ReSharper GetHashCode?

Comme beaucoup d'entre vous, j'utilise ReSharper pour accélérer le processus de développement. Lorsque vous l'utilisez pour remplacer 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, j'ai certains de mes propres membres là-bas, mais ce que je veux savoir, c'est pourquoi 397?

  • EDIT: Donc, ma question serait mieux formulée comme, y at-il quelque chose de "spécial" sur le nombre premier 397 en dehors de lui étant un nombre premier?
141
programmer

Probablement parce que 397 est un nombre premier de taille suffisante pour provoquer un débordement de la variable de résultat et mélanger quelque peu les bits du hachage, offrant une meilleure distribution des codes de hachage. Il n'y a rien de particulièrement spécial dans le 397 qui le distingue des autres nombres premiers de même ampleur.

154
Nick Johnson

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

17
Nick Craver

Le hachage utilisé par le resharper ressemble à une variante du hachage FNV . FNV est fréquemment implémenté avec différents nombres premiers. Il y a une discussion sur le choix approprié de nombres premiers pour FNV ici .

12
kybernetikos