【发布时间】:2017-05-02 04:44:54
【问题描述】:
我只是浪费了几个小时的调试时间,然后才意识到与 .NET 相反,在 .NET Core 中,每次运行代码时 GetHashCode 都会返回不同的值。 我完全理解这样做的理由。依赖哈希码值是一个非常糟糕的主意(比如序列化它们)。我什至记得 Microsoft 的 .NET 内部构建(在 Core 之前)会改变 GetHashCode 的每次构建行为,因此没有人对它感到太舒服。
说了这么多,我目前正在调试大量使用 GetHashCode 的复杂代码。我知道这个错误是我自己做的,与 GetHashCode 无关,但每次我运行它时,它都会在其他地方失败。很烦人。 有没有办法强制 GetHashCode 表现得像在 .NET 中一样(在我调试时),而不必编写我自己的哈希函数并且不必在我的代码中到处替换它?
【问题讨论】:
-
您的意思是
String.GetHashCode()还是Object.GetHashCode()?我认为您根本无法影响后者。它总是基于对象引用,它永远是伪确定性的。前者在编译时由FEATURE_RANDOMIZED_STRING_HASHING管理,在运行时由<UseRandomizedStringHashAlgorithm>管理——但我不知道.NET Core 是否尊重后者,只是默认情况下它肯定是开启的。 -
澄清一下,当我说“编译时”时,我的意思是在编译 runtime 时,而不是你自己的应用程序。在您自己的代码中定义
FEATURE_RANDOMIZED_STRING_HASHING没有任何作用。但是 .NET Core 是开源的,如果涉及到,您总是可以重新构建它。 -
我的代码是通用的,所以实际上它是 object.GetHashCode() 但在我的示例中,对象是一个字符串,因此哈希码基于(不可变的)字符串内容。
标签: .net-core