0

GetHashCode() メソッドがオブジェクトに対して一意の値を返すようにするために従うべき規則は何ですか?

例えば:

  • 計算にいくつかのプリブメンバーを含める必要がありますか?
  • 合計ではなく乗算する必要がありますか?
  • 特定のオブジェクト グラフに対して一意のハッシュ コードを生成していると確信できますか? 等
4

3 に答える 3

6

オブジェクトごとに一意の値を返すことを目指すべきではありません。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());
    
于 2011-09-05T20:12:42.613 に答える
1

比較のために Equals もオーバーライドする必要があるため、必ずしもフール プルーフ ハッシュコードは必要ありません。通常、私が行うことは、オブジェクト間で異なることがわかっている値を取得し、それらを文字列に連結して、そのハッシュを返すことです。

于 2011-09-05T20:13:39.613 に答える
0

あなたの答えはここにあると思います:Jon Skeetの答えを参照してください。一般的にかなり信頼できる計算方法です。時間によって証明された:)

オーバーライドされた System.Object.GetHashCode に最適なアルゴリズムは何ですか?

于 2011-09-05T20:13:34.603 に答える