2013-11-10 105 views
0

今天我想用C#測試我的關鍵程序。在這個程序中,一些屬性將通過GetHashCode()方法進行散列。 執行部分程序後,添加了單元測試項目。 然後我在調試模式下運行該程序,並將散列數據複製到記事本以用於單元測試項目的比較。 之後,在調試模式下運行測試方法,並再次獲得散列數據並將其複製到記事本。 在這種情況下,我看到在調試模式和單元測試模式下,唯一字符串的散列碼與不同。調試和單元測試運行時GetHashCode不同的結果

我不知道它在哪裏引發,以及如何解決這個問題。

這是一個問題嗎?

回答

4

MSDN上的這個article包含一個明確的警告,您不應該持久化字符串的哈希碼。不能保證相同的字符串值將映射到應用程序域之外的相同哈希碼。

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

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

結果,散列碼不應該在它們被創建的應用 域之外的使用,它們不應該被 用作集合中的密鑰字段,並且它們不應該是 持續。

最後,如果您需要加密性較強的 散列,請勿使用散列代碼而不使用加密散列函數返回的值。對於加密散列,請使用System.Security.Cryptography.HashAlgorithm或 System.Security.Cryptography.KeyedHashAlgorithm類派生的類。

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

所以對你的考驗,我想無論是依靠了的GetHashCode的實現字符串是正確的,或者創建和注入mockable哈希代碼提供返回string.GetHashCode正常的代碼,並通過模擬取代時,運行測試。隨着「哈希代碼提供者」,我的意思是有一個返回的哈希碼給定的字符串的方法,例如,一個抽象類或接口:

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

更輕量級的方法是注入返回的具有功能代碼,例如:Func<string, int>。默認功能是x => x.GetHashCode()

相關問題