1. ホーム
  2. hash

[解決済み] ReSharperのGetHashCodeのオーバーライドに'397'が使用されているのはなぜですか?

2022-04-25 22:58:33

質問

多くの方と同じように、私も開発のスピードアップのためにReSharperを使用しています。ReSharperを使ってクラスの等式メンバをオーバーライドすると、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には、同じ大きさの他の素数と区別するような特別な点は何もありません。