2013-11-10 112 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()

相关问题