GetHashCode() メソッドがオブジェクトに対して一意の値を返すようにするために従うべき規則は何ですか?
例えば:
- 計算にいくつかのプリブメンバーを含める必要がありますか?
- 合計ではなく乗算する必要がありますか?
- 特定のオブジェクト グラフに対して一意のハッシュ コードを生成していると確信できますか? 等
GetHashCode() メソッドがオブジェクトに対して一意の値を返すようにするために従うべき規則は何ですか?
例えば:
オブジェクトごとに一意の値を返すことを目指すべきではありません。GetHashCode()
それはのポイントではありませんGetHashCode()
。
Eric Lippert のハッシュ コードに関する素晴らしい投稿があります。よく読んでください。基本的には、2 つの等しいオブジェクトに対して常に同じ値を返し(そして、等しいとはどういう意味かを理解する必要があります)、2 つの等しくないオブジェクトに対して異なる値を返す可能性が高いものに行き着きたいと考えています。
個人的には、次のような実装を使用する傾向があります。
public override int GetHashCode()
{
int hash = 17;
hash = hash * 31 + field1.GetHashCode();
hash = hash * 31 + field2.GetHashCode();
hash = hash * 31 + field3.GetHashCode();
...
return hash;
}
注意事項:
フィールドが null になる可能性がある場合は、ハッシュの計算中にそれを確認する必要があります。例えば:
hash = hash * 31 + (field2 == null ? 0 : field2.GetHashCode());
比較のために Equals もオーバーライドする必要があるため、必ずしもフール プルーフ ハッシュコードは必要ありません。通常、私が行うことは、オブジェクト間で異なることがわかっている値を取得し、それらを文字列に連結して、そのハッシュを返すことです。
あなたの答えはここにあると思います:Jon Skeetの答えを参照してください。一般的にかなり信頼できる計算方法です。時間によって証明された:)