0

今天我想用 C# 测试我的关键程序。在这个程序中,一些属性将通过GetHashCode()方法散列。在实施部分程序后,添加了单元测试项目。然后我在调试模式下运行程序并将散列数据复制到记事本以用于单元测试项目的比较。之后在调试模式下运行测试方法并再次获取散列数据并将其复制到记事本。在这种情况下,我看到唯一字符串的哈希码在调试模式和单元测试模式下并不相同。

我不知道它在哪里提出以及如何解决这个问题。

那是问题吗?

4

1 回答 1

4

MSDN 上的这篇文章包含一个明确的警告,即您不应保留字符串的哈希码。不能保证相同的字符串值将映射到应用程序域之外的相同哈希码。

如果两个字符串对象相等,则 GetHashCode 方法返回相同的值。但是,每个唯一的字符串值都没有唯一的哈希码值。不同的字符串可以返回相同的哈希码。

哈希码本身不能保证是稳定的。对于单个版本的 .NET Framework,相同字符串的哈希码在不同版本的 .NET Framework 和不同平台(例如 32 位和 64 位)之间可能会有所不同。在某些情况下,它们甚至可能因应用程序域而异。

因此,哈希码不应该在创建它们的应用程序域之外使用,它们不应该被用作集合中的关键字段,也不应该被持久化。

最后,如果您需要加密的强散列,请不要使用散列码而不是加密散列函数返回的值。对于加密哈希,请使用派生自 System.Security.Cryptography.HashAlgorithm 或 System.Security.Cryptography.KeyedHashAlgorithm 类的类。

有关哈希码的详细信息,请参阅 Object.GetHashCode。

因此,对于您的测试,我要么依赖 String 的 GetHashCode 实现是正确的,要么创建并注入一个可模拟的哈希代码提供程序,该提供程序返回 string.GetHashCode 以获取普通代码,并在运行测试时被模拟替换。对于“哈希码提供程序”,我的意思是一个抽象类或接口,它具有一个返回给定字符串的哈希码的方法,例如:

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

一种更轻量级的方法是注入一个返回 has 代码的函数,例如:Func<string, int>. 默认功能是x => x.GetHashCode().

于 2013-11-10T07:47:55.500 回答