インターフェイスのGetHashCode
メソッドに関するドキュメントの「実装者への注意事項」セクションには、次のように記載されています。IEqualityComparer<T>
Equals メソッドが 2 つのオブジェクト x と y に対して true を返す場合、x の GetHashCode メソッドによって返される値が y に対して返される値と等しくなければならないことを保証する実装が必要です。
T
2 つの項目が等しい場合に、 の2 つのインスタンスが同じハッシュ コードを返すようにする理由はよく知られています。それらが異なるということは、それらが等しくないことを意味しますが、それらが同じであることは、それらが潜在的に等しいことを意味します。
2 つのインスタンスが等しくない場合 (それらの値がそうであることを示唆している場合でも) 、戻り値の引用符は未定義であると解釈します。
以下を例にとります。null 以外のそれぞれがクラスの属性を表す統計的分類int?
に使用したいシーケンスがあります (列挙値を考えてください)。これらの値が null の場合、トレーニング セットが欠損値に偏ってしまうため、値が等しいと見なされることは望ましくありません。どちらかといえば、この場合、他の null 値と比較して false を返す null 値が必要です。int?
問題は、GetHashCode
メソッドで null が指定された場合、おそらく 0 (または他の数値、おそらく ) を返したいことですInt32.MinValue
。IEqualityComparer<T>
さて、この実装を使用して何かにキーを付けると、ディクショナリ内のキーの存在をチェックするパフォーマンスが最適化されないことがわかりました。
つまり、GetHashCode
が呼び出されたときに他の値と競合することがわかっている値を返すことは有効ですか? への呼び出しEquals
が false を返す場合は? 上記の引用はこの問題では定義されていないため、私はイエスに傾いています。