1

Equals(T x, T y)IEqualityComparer に関して、実装が以下のもの以外のものでなければならない理由はありますか?

public class MyEquality : IEqualityComparer<MyType>
{
    //My Equals(T x, T y) always looks like this
    public bool Equals(MyType x, MyType y)
    {
        return this.GetHashCode(x).Equals(this.GetHashCode(y));
    }

    public int GetHashCode(MyType obj)
    {
        //assume MyType has a non-nullable member called ID
        return obj.ID.GetHashCode();
    }
}
4

4 に答える 4

4

はい。ハッシュコードは衝突する可能性があり、実際には多くのタイプで衝突します。これらは、ハッシュ テーブル内の値の均等分散を保証するためだけに存在し、値の均等性を判断するのには役立ちません。Eric Lippertもこれ (および別のもの) を取り上げています。

32 ビットのハッシュ コードを「一意の」識別子として使用するのは、非常に悪い考えです。ハッシュ値自体はランダムではありませんが、適切に分散されている場合は、目的に合ったものになる可能性があります。40 億以上の可能な値があるのに、利用可能なハッシュ コードは 40 億しかないので、明らかにそれらは真に一意ではありません。しかし、考えられるハッシュ値は非常に多いため、ハッシュに対して一意の値を取得できる可能性は非常に高いです。」しかし、チャンスは本当に良いですか?9300 個のオブジェクトはそれほど多くなく、1% はかなり高い衝突確率です。

そうは言っても、平等を判断するときにIDだけを気にする場合は、そのIDを比較するだけで十分です。しかし、ハッシュコードは言うだけなので、そのハッシュコードではありません

a .GetHashCode() ≠ b .GetHashCode() → ab

ハッシュコードが同じ場合については何も述べていないことに注意してください。

于 2013-04-17T15:42:33.853 に答える
0

もちろん。1 つ以上のプロパティが同じであることにのみ関心があるオブジェクトを使用して、それらが同じであると見なすことができます。

于 2013-04-17T15:44:46.367 に答える