多くの皆さんと同様に、私は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について特に特別なものは何もありません。
ベンは正解です。アセンブリを反映して、使用するために選択した素数にすぎないことがわかります。
Resharperが使用するハッシュは、 [〜#〜] fnv [〜#〜] ハッシュのバリアントのように見えます。 FNVは、異なる素数で実装されることがよくあります。 FNV here の素数の適切な選択に関する議論があります。