[英]Equals, GetHashCode, EqualityComparers and fuzzy equality
[英]GetHashCode Equality
我對此感到疑惑,所以我想我會問它。
您將看到的大多數地方使用相同的語義邏輯來覆蓋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);
}
因為有沖突的真正危險。 散列碼不是唯一的。 他們可以(當不同時)證明不平等,但絕不平等。 尋找物品時:
true
它們是相同的 考慮long
...因為哈希代碼是int
,所以很容易看出有很多沖突。
散列不是1對1,您可以有多個不同的值,這些值散列到相同的值,但應該比較為不相等。 所以你無法在GetHashCode方面真正實現Equals。 這就是您在哈希表中發生沖突的原因,以及為什么哈希表查找必須涉及對GetHashCode和Equals的調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.