2011-05-24 175 views
11

我宣佈的代碼,像這樣GetHashCode()在不同的服務器上給出不同的結果?

int hashcode = "apple".GetHashCode(); 

在我的電腦,在工作中計算機C#線,和一個朋友的電腦,結果是1657858284.在開發服務器,結果是1548091822.是否有我告訴項目總是讓GetHashCode()產生1657858284的方式,而不管它在哪個服務器上?

更多注意事項 起初,我注意到版本有所不同... 1657858284結果來自.NET 3.5和.NET 4.0。 1548091822來自.NET 2.0。

我再叫視覺工作室2010年編制項目作爲.NET 2.0的項目,但它還是給了我1657858284.

+2

那麼,電腦之間有什麼區別?不同的.NET版本,也許? – 2011-05-24 18:01:06

+3

[來自MSDN](http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx)「.NET Framework不保證GetHashCode方法的默認實現,並且它的值.NET Framework的不同版本之間的返回值是相同的。「 – AbrahamJP 2011-05-24 18:01:58

+0

從我的理解中,GetHashCode僅用作查找關鍵字,例如hashmaps。所以我不確定你可以期待GetHashCode()產生類似的結果。但我相信你可以重寫GetHashCode() – Cilvic 2011-05-24 18:05:10

回答

15

這有可能是你使用2個不同版本的.NET。 此行爲注意到MSDN文章:
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
從言論:

GetHashCode方法的默認實現不保證唯一的返回值不同的對象。此外,.NET Framework不保證GetHashCode方法的默認實現,並且它返回的值在不同版本的.NET Framework之間將保持不變。因此,此方法的默認實現不能用作用於散列目的的唯一對象標識符。

2

爲了您的自定義類返回一個穩定的散列碼應該重寫的GetHashCode()方法,否則Object類的GetHashCode方法將被使用,這一點我覺得可以有很大的差異。 (甚至可能是特定於實例)。

23

正如其他人已經指出,這是根據文件。你一定不能依賴於GetHashCode返回相同的東西,永遠。您可以依賴的唯一不變量是如果對象未以任何方式改變其相等語義,它將在同一appdomain中的相同對象上返回相同的值。如果沒有滿足任何條件 - 如果這兩個對象位於不同的應用程序域中,或者對象以改變其相等語義的方式進行了變異 - 那麼您無法保證「相同」對象將返回相同的散列碼。

您應該使用哈希碼的唯一方法是平衡哈希表。任何其他用法均爲「非標籤」,風險自負。不要這樣做。如果你需要一個穩定的字符串散列,可以跨越任意的邊界,然後使用行業標準算法,如SHA256或其他。

見我的文章歸檔約哈希問題的更多細節,如果這個問題你感興趣:

http://blogs.msdn.com/b/ericlippert/archive/tags/hashing/

1

如果你需要有一個校驗和例如使您能夠快速驗證傳輸數據的完整性,簡單地用位的適當數量(加密)哈希運行它,因爲

- MD5 
- SHA256 
- SHA1 
- fletcher 

。Net的GetHashCode並不意味着要識別任何東西(無論如何,32位將很快導致碰撞,這就是爲什麼你無法使用它來識別字符串的原因。)

請注意,即使上述四個將允許碰撞(但不太快);所以一定要只有用它作爲校驗碼,不能識別。

相關問題