我对此感到疑惑,所以我想我会问它。
您将看到的大多数地方使用相同的语义逻辑来覆盖Equals作为成员相等的GetHashCode ...但是它们通常使用不同的实现:
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
var other = (MyType)obj;
if (other.Prop1 != Prop1)
{
return false;
}
return true;
}
public override int GetHashCode()
{
int hash = -657803396;
num ^= Prop1.GetHashCode();
return num;
}
如果您正在为您的类型实现成员相等(假设存储在字典中),为什么不重写GetHashCode,然后对Equals执行类似的操作:
public override bool Equals(object obj)
{
return this.HashEqualsAndIsSameType(obj);
}
public static bool HashEquals(this object source, object obj)
{
if (source != null && obj != null)
{
return source.GetHashCode() == obj.GetHashCode();
}
if (source != null || obj != null)
{
return false;
}
return true;
}
public static bool HashEqualsAndIsSameType<T>(this T source, object obj)
{
return (obj == null || obj.GetType() == typeof(T)) && source.HashEquals(obj);
}
答案 0 :(得分:10)
因为 存在真正的冲突风险。哈希码不唯一。他们可以(当不同时)证明不平等,但绝不平等。寻找物品时:
true
它们是相同的考虑long
...因为哈希码是int
,所以很容易看出有很多冲突。
答案 1 :(得分:1)
哈希不是1对1,您可以有多个不同的值,这些值哈希到相同的值,但应该比较为不相等。所以你无法在GetHashCode方面真正实现Equals。这就是您在哈希表中发生冲突的原因,以及为什么哈希表查找必须涉及对GetHashCode和Equals的调用。