8

GetHashCode() をオーバーライドする CustomObject オブジェクトがあります。HashSet があり、同じハッシュ コードを持つ 2 つの異なるオブジェクトで add を呼び出すことができます。両方が追加され、後でデータベース挿入の問題 (主キーの重複) が発生します... hashSet を使用する目的は、これらのデータベース挿入に関連していました (キーの衝突を回避します)。

HashSet のいくつかのプロパティを見逃している可能性がありますか? (.Add)を追加する前に(.Contains)をチェックしようとしても、hashCodeの重複を追加してしまいます...

4

3 に答える 3

30

HashSet<T>メンバーシップは、ハッシュ コードの等価性ではなく、オブジェクトの等価性に基づいているためです。HashSet<T>に従ってメンバーが異なる限り、a のすべてのメンバーが同じハッシュ コードを持つことは完全に合法ですEquals。ハッシュ コードが果たす役割HashSet<T>は、メンバーシップの迅速なテストです。オブジェクトがあり、そのハッシュ コードが にないHashSet<T>場合、オブジェクトが にないことがわかりますHashSet<T>。オブジェクトがあり、そのハッシュ コードが にある場合は、オブジェクトが実際に にあるかどうかを確認するために、HashSet<T>を使用して等価性をテストする同じハッシュ コードを使用してオブジェクトのチェーンをたどる必要があります。そのため、バランスのとれたハッシュ コードの配布が重要です。しかし、一意のハッシュ コードが必要な場合はそうではありません。EqualsHashSet<T>

于 2012-06-06T15:07:32.450 に答える
11

GetHashCodeをオーバーライドするだけでは不十分です。Equals関数もオーバーライドする必要があります。

于 2012-06-06T15:10:18.980 に答える
0

値の重複を避けるためにハッシュセットを使用しないでください。ハッシュテーブルのバランスをとるためにそれらを使用してください!

于 2012-06-06T15:07:43.510 に答える