簡體   English   中英

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

因為沖突的真正危險。 散列碼不是唯一的。 他們可以(當不同時)證明不平等,但絕不平等。 尋找物品時:

  • 獲取哈希碼
  • 如果哈希碼不同,則對象不同; 丟棄它
  • 如果哈希碼相同,請檢查等於:
  • 如果Equals報告為true它們是相同的
  • 否則丟棄

考慮long ...因為哈希代碼是int ,所以很容易看出有很多沖突。

散列不是1對1,您可以有多個不同的值,這些值散列到相同的值,但應該比較為不相等。 所以你無法在GetHashCode方面真正實現Equals。 這就是您在哈希表中發生沖突的原因,以及為什么哈希表查找必須涉及對GetHashCode和Equals的調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM