簡體   English   中英

GetHashCode在調試和單元測試運行時的結果不同

[英]GetHashCode different result on Debug and Unit Test running

今天,我想用C#測試關鍵程序。 在此程序中,某些屬性將通過GetHashCode()方法進行哈希處理。 在執行部分程序之后,添加了單元測試項目。 然后,我在調試模式下運行該程序,並將散列數據復制到記事本中,以用於在單元測試項目上進行比較。 之后,在調試模式下運行測試方法,然后再次獲取散列數據並將其復制到記事本。 在這種情況下,我看到在調試模式和單元測試模式下,唯一字符串的哈希碼並不相同

我不知道它在哪里提出以及如何解決這個問題。

那是問題嗎?

MSDN上的本文包含明確警告,您不應保留字符串的哈希碼。 不保證相同的字符串值將映射到應用程序域外部的相同哈希碼。

如果兩個字符串對象相等,則GetHashCode方法返回相同的值。 但是,每個唯一的字符串值都沒有唯一的哈希碼值。 不同的字符串可以返回相同的哈希碼。

不能保證哈希碼本身是穩定的。 對於.NET Framework的單個版本,相同字符串的哈希碼在.NET Framework的版本之間以及在平台(例如32位和64位)之間可能有所不同。 在某些情況下,它們甚至可能因應用程序域而異。

因此,永遠不要在創建哈希碼的應用程序域之外使用哈希碼,永遠不要將哈希碼用作集合中的關鍵字段,並且永遠不要保留它們。

最后,如果您需要加密強度高的哈希,請不要使用哈希碼代替加密哈希函數返回的值。 對於加密哈希,請使用派生自System.Security.Cryptography.HashAlgorithm或System.Security.Cryptography.KeyedHashAlgorithm類的類。

有關哈希碼的更多信息,請參見Object.GetHashCode。

因此,對於您的測試,我要么依靠String的GetHashCode-implementation是正確的,要么創建並注入一個可模擬的哈希代碼提供程序,該提供程序返回string.GetHashCode作為常規代碼,並在運行測試時由模擬代替。 對於“哈希代碼提供程序”,我的意思是一個抽象類或接口,該類或接口具有一種返回給定字符串的哈希代碼的方法,例如:

internal interface IHashCodeProvider
{
    int ProvideHashCode(string stringValue);
}

一種更輕量級的方法是注入一個返回has代碼的函數,例如: Func<string, int> 默認函數是x => x.GetHashCode()

暫無
暫無

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

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