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

StackOverflow https://stackoverflow.com/questions/102742

質問

皆さんの多くと同じように、私も開発プロセスをスピードアップするために 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 が素数であること以外に、何か「特別な」ものはありますか? というように表現したほうがよいでしょう。
役に立ちましたか?

解決

おそらく、397 が十分なサイズの素数であるため、結果変数がオーバーフローしてハッシュのビットが多少混合され、ハッシュ コードの分散が向上します。397 には、同じ大きさの他の素数と区別する特別な点は何もありません。

他のヒント

ベンの意見は正しく、議会を反映すると、それが彼らが使用するために選択した単なる素数であることがわかります。

Resharper が使用するハッシュは、 FNV ハッシュ。FNV は、さまざまな素数を使用して実装されることがよくあります。FNV の素数の適切な選択について議論されています。 ここ.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top