2011-10-22 45 views
0

可能重複:
Can I depend on the values of GetHashCode() to be consistent?.GetHashCode保證在系統/平臺版本中保持一致?

如果我使用Object.GetHashCode()方法在兩個系統間/ framework版本的,我保證可以得到相同的輸入相同的值?換句話說,它的價值是否成爲持久數據的關鍵?

注:我不在乎這個問題的衝突。

作爲獎勵,我保證在Mono和Microsoft.Net中獲得相同的價值嗎?

+0

據我所知,在兩臺完全相同的機器上,你甚至不能保證獲得相同的值。 – delnan

+2

Dublicate http://stackoverflow.com/questions/53086/can-i-depend-on-the-values-of-gethashcode-to-be-consistent –

+1

如果你想要一個string.GetHashCode()的實現已經改變具體的反例 –

回答

3

其他問題? :-)

使用的算法沒有公佈,也沒有在Ecma標準中。

我會從MSDN String.GetHashCode引用(我認爲這個例子是不夠好)

的GetHashCode的行爲取決於它的實現,這可能會從公共語言運行庫的一個版本改變另一個。這可能發生的原因是爲了提高GetHashCode的性能。

0

答案是否定的

規則:GetHashCode的消費者不能依靠它暫時穩定一段時間或跨應用程序域

假設你有一個有一堆像領域的客戶對象名稱,地址等。如果在兩個不同的進程中使兩個這樣的對象具有完全相同的數據,則它們不必返回相同的哈希碼。如果你在21日這樣的目的是在一個過程中,將其關閉,並在週三再次運行該程序中,哈希代碼可以是different./blockquote>

閱讀全文從Guidelines and rules for GetHashCode

0

你可以做如果您覆蓋GetHashCode()並提供您自己的實現,則返回相同的結果。雖然我不確定爲什麼要使用返回值作爲持久存儲的關鍵,但在將對象首次插入到存儲庫中時,爲對象提供它們自己的預定(計算)的鍵也同樣簡單。所有應有的尊重,但使用返回的哈希代碼作爲關鍵只是似乎你試圖爲自己的善良太聰明。

1

從技術上講,這取決於您的類如何覆蓋GetHashCode。如果你有這個:

class MyClass 
{ 
    public override int GetHashCode() { return 42; } 
} 

那麼這將是一致的單聲道和.NET。 :)

當然,如果您的GetHashCode實現取決於不能保證跨平臺一致性的類型(例如string),那麼MyClass.GetHashCode()也將不一致。

+0

生命,宇宙和萬物終極問題的答案是什麼? (new MyClass())。GetHashCode()的確如此。 –