今天我想用C#测试我的关键程序。在此程序中,某些属性将通过GetHashCode()
方法进行哈希处理。
实现部分程序后,添加了单元测试项目。
然后我以调试模式运行程序并将散列数据复制到记事本以用于单元测试项目的比较。
之后在调试模式下运行测试方法并再次获取散列数据并将其复制到记事本。
在这种情况下,我看到在调试模式和单元测试模式下,唯一字符串的哈希码不是它们相同。
我不知道它在哪里提出以及如何解决这个问题。
这是一个问题吗?
答案 0 :(得分:4)
MSDN上的此article包含一个明确的警告,您不应该保留字符串的哈希码。不能保证相同的字符串值将映射到应用程序域之外的相同哈希代码。
如果两个字符串对象相等,则返回GetHashCode方法 相同的价值观但是,没有唯一的哈希码值 每个唯一的字符串值。不同的字符串可以返回相同的散列 码。
哈希码本身并不保证稳定。哈希代码 相同的字符串可能因.NET Framework的版本而异 跨平台(例如32位和64位)的单个版本 .NET Framework。在某些情况下,它们甚至可以因应用而异 域。
因此,哈希码永远不应该在外面使用 创建它们的应用程序域,它们永远不应该存在 用作集合中的关键字段,它们永远不应该存在 持续存在。
最后,不要使用哈希码而不是a返回的值 加密哈希函数,如果你需要加密强大 哈希值。对于加密哈希,请使用从中派生的类 System.Security.Cryptography.HashAlgorithm或 System.Security.Cryptography.KeyedHashAlgorithm类。
有关哈希码的更多信息,请参阅Object.GetHashCode。
因此,对于您的测试,我要么依赖于String的GetHashCode实现是正确的,要么创建并注入一个可模拟的哈希代码提供程序,该提供程序返回普通代码的string.GetHashCode,并在运行测试时由mock替换。对于“哈希代码提供者”,我的意思是一个抽象类或接口,它有一个返回给定字符串的哈希码的方法,例如:
internal interface IHashCodeProvider
{
int ProvideHashCode(string stringValue);
}
更轻量级的方法是注入一个返回has代码的函数,例如:Func<string, int>
。默认函数为x => x.GetHashCode()
。