2010-08-23 31 views
2

如何基於標識爲對象生成哈希碼。在.net中生成基於對象標識的哈希碼

我的意思是說:

  • 如果object.ReferenceEquals(a, b) == true,然後ab將得到相同的散列碼。
  • 如果object.ReferenceEquals(a, b) == false,然後ab應該有一個很好的機會獲得不同的哈希碼,即使他們是成員平等。

我所擁有的是:

class SomeClassThatMakesSenseToCompareByReferenceAndByValue { 
    override Equals(object o) { 
     return MemberwiseEquals(o); 
    } 

    override GetHashCode() { 
     return MemberwiseGetHashCode(); 
    } 
} 

class SomeClassThatNeedsReferenceComparison { 
    SomeClassThatMakesSenseToCompareByReferenceAndByValue obj; 

    override Equals(object o) { 
     return o is SomeClassThatNeedsReferenceComparison && object.ReferenceEquals(this.obj, (o as SomeClassThatNeedsReferenceComparison).obj); 
    } 

    override GetHashCode() { 
     return ????? 
    } 
} 
+2

這可能有助於更詳細地解釋您的使用情況。 – 2010-08-23 11:15:17

+0

*「即使它們是成員平等也會得到不同的哈希碼」* - 聽起來有點奇怪。考慮GetHashCode文檔中的以下文本(在「實現者註釋」下):*「如果兩個對象的比較相等,則每個對象的GetHashCode方法必須返回相同的值」*。我可能會錯過某些東西。 – 2010-08-23 11:40:33

+0

這就是爲什麼我的'SomeClassThatMakesSenseToCompareByReferenceAndByValue'類返回一致的哈希碼。但在另一個類中,我想使用基於身份的'GetHashCode'和'Equals'。 – erikkallen 2010-08-23 12:01:31

回答

3

您可能正在尋找RuntimeHelpers.GetHashCode

+1

它完全等價於object.GetHashCode – Andrey 2010-08-23 11:16:37

+0

謝謝,就是這樣。 – erikkallen 2010-08-23 11:28:46

+0

@Andrey只有當動態類型的對象不覆蓋GetHashCode時,它纔是等價的。 @erikkallen歡迎您。 – 2010-08-23 11:32:51

2

如果不重寫GetHashCode它會返回同文哈希碼。

+0

是的,但我需要以另一種方式訪問​​該功能。 – erikkallen 2010-08-23 11:09:30

+0

@erikkallen用什麼方式? – 2010-08-23 11:10:33

+1

因爲'object.ReferenceEquals(a,b)== true'我想說'GetHashCode'的任何*實現都不會產生'a'和'b'的不同結果(它基本上需要涉及隨機元素或時間)。 – 2010-08-23 11:10:50

1

不要做任何事情 - 因爲兩個對象都指向同一個實例,所以對於使用默認實現的兩個對象總是會生成相同的HashCode。