簡體   English   中英

GetHashCode() 在不同的服務器上給出不同的結果?

[英]GetHashCode() gives different results on different servers?

我像這樣聲明了 C# 代碼行

int hashcode = "apple".GetHashCode();

在我的電腦、工作的電腦和朋友的電腦上,結果是 1657858284。在開發服務器上,結果是 1548091822。有沒有辦法告訴項目始終讓 GetHashCode() 產生 1657858284,不管它在哪個服務器上?

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

然后我告訴 Visual Studios 2010 將項目編譯為 .net 2.0 項目,但它仍然給了我 1657858284。

正如其他人所指出的,這與文檔一致。 永遠不能依賴 GetHashCode 返回相同的東西。 您可以依賴的唯一不變量是,如果 object 沒有以任何改變其相等語義的方式發生突變,它將在同一 appdomain 中的同一 object 上返回相同的值 如果不滿足這些條件中的任何一個——如果兩個對象位於不同的應用程序域中,或者 object 以改變其相等語義的方式發生突變——那么您無法保證“相同”對象將返回相同的 hash代碼。

您應該使用 hash 代碼的唯一方法是平衡 hash 表。 任何其他使用都是“標簽外”,風險自負。 不要這樣做。 如果您需要一個穩定的字符串 hash 可以跨越任意邊界,請使用行業標准算法,如 SHA256 或其他東西。

如果您對此主題感興趣,請參閱我關於哈希問題的文章存檔以獲取更多詳細信息:

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

您可能正在使用 2 個不同版本的 .Net。 此行為在 MSDN 文章中注明:
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
從評論中:

GetHashCode 方法的默認實現不保證不同對象的唯一返回值。 此外,.NET 框架不保證 GetHashCode 方法的默認實現,它返回的值在不同版本的 .NET 框架之間是相同的。 因此,此方法的默認實現不得用作用於散列目的的唯一 object 標識符。

為了讓您的自定義類返回穩定的 hash 代碼,您應該重寫 GetHashCode() 方法,否則 Object class 的 GetHashCode 方法會有所不同。 (甚至可能是特定於實例的)。

如果您需要一個校驗和,例如允許您在傳輸中快速驗證數據完整性,只需通過具有適當位數的(加密)hash 運行它,如

- MD5
- SHA256
- SHA1
- fletcher

.Net 的GetHashCode並不意味着識別任何東西(無論如何,32 位很快就會導致沖突,這就是為什么你不能用它來識別字符串。)

請注意,即使是上述四個也會允許碰撞(但不太快); 所以請確保將其用作校驗和,而不是標識。

暫無
暫無

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

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