Question

Comme beaucoup d’entre vous, j’utilise ReSharper pour accélérer le processus de développement. Lorsque vous l'utilisez pour redéfinir les membres d'égalité d'une classe, le code qu'il génère pour GetHashCode () ressemble à ceci:

    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, certains de mes membres sont présents, mais ce que je veux savoir, c'est pourquoi 397?

  • EDIT: Donc, ma question serait mieux libellée, y at-il quelque chose de "spécial" dans le nombre premier 397 en dehors de lui étant un nombre premier?
Était-ce utile?

La solution

Probablement parce que 397 est un nombre premier de taille suffisante pour faire déborder la variable résultat et mélanger un peu les bits du hachage, ce qui permet une meilleure distribution des codes de hachage. 397 n’a rien de particulièrement spécial qui le distingue des autres nombres premiers de même ampleur.

Autres conseils

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top