我想知道这一点,所以我想我会问它。
你会看到大多数地方使用相同的语义逻辑来覆盖等于,就像成员式equality...however的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);
}发布于 2010-10-12 13:59:53
因为确实存在冲突的风险。哈希码是而不是唯一的。他们可以(在不同的时候)证明不平等,但永远不会证明平等。查找项目时:
true
以long为例。因为哈希码是int的,所以很容易看到有很多很多冲突。
发布于 2010-10-12 13:59:11
散列不是一对一的,你可以有多个不同的值散列到相同的值,但它们应该是不相等的比较。因此,就GetHashCode而言,您不能真正实现Equals。这就是为什么在哈希表中会有冲突,以及为什么哈希表查找必须涉及对GetHashCode和Equals的调用。
https://stackoverflow.com/questions/3912018
复制相似问题