web-dev-qa-db-ja.com

ReSharper GetHashCodeオーバーライドに「397」が使用されるのはなぜですか?

多くの皆さんと同様に、私はReSharperを使用して開発プロセスを高速化します。これを使用してクラスの等値メンバーをオーバーライドすると、GetHashCode()に対して生成されるコード生成は次のようになります。

    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;
        }
    }

もちろん、自分のメンバーも何人かいますが、なぜ397なのか知りたいのはなぜですか?

  • 編集:だから私の質問は、397素数が素数である以外に「特別な」何かがあるのですか?
141
programmer

おそらく、397は結果変数がオーバーフローしてハッシュのビットをいくらか混合するのに十分なサイズの素数であり、ハッシュコードのより良い分布を提供するためです。同じ大きさの他の素数からそれを区別する397について特に特別なものは何もありません。

154
Nick Johnson

ベンは正解です。アセンブリを反映して、使用するために選択した素数にすぎないことがわかります。

17
Nick Craver

Resharperが使用するハッシュは、 [〜#〜] fnv [〜#〜] ハッシュのバリアントのように見えます。 FNVは、異なる素数で実装されることがよくあります。 FNV here の素数の適切な選択に関する議論があります。

12
kybernetikos