关于IEqualityComparer,是否有理由为什么Equals(T x, T y)实现应该是我下面所没有的?

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();
    }
}

最佳答案

是。哈希码可能会冲突,实际上,它们会具有多种类型。它们仅存在以确保哈希表中的值相等分布,它们对确定值的相等性没有用。 Eric Lippert也对此有一个看法(和another one):


  使用32位哈希码作为“唯一”标识符是一个非常糟糕的主意。哈希值本身并不是随机的,但是如果它们分布合理,那么它们也很可能是我们的目的。您可能会想:“当然,显然它们并不是真正唯一的,因为可能的值超过40亿,但只有40亿的哈希码可用。但是散列值太多了,赔率实在是太好了,我将获得哈希值的唯一值。”但是机会真的那么好吗? 9300个对象并不多,只有1%的对象发生碰撞的可能性很高。


话虽如此,如果您的ID是确定相等性时唯一要注意的事情,那么比较该ID就足够了。但不是其哈希码,因为哈希码仅表示


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


注意,对于哈希码相同的情况,没有任何说明。

关于c# - 我应该如何实现IEqualityComparer <T> .Equals,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16064419/

10-11 04:34