.net core 有没有办法使.NET核心GetHashCode具有确定性

.net core 有没有办法使.NET核心GetHashCode具有确定性,.net-core,.net Core,我只是浪费了几个小时的调试时间,才意识到与.NET相反,在.NET内核中,GetHashCode在每次运行代码时都返回不同的值。 我完全理解这样做的理由。依赖哈希代码值是一个非常糟糕的主意(比如序列化它们)。我甚至记得微软的.NET内部版本(在Core之前)会改变每个版本的GetHashCode行为,所以没有人会对它感到太舒服 说到这里,我目前正在调试大量使用GetHashCode的复杂代码。我知道这个bug是我自己造成的,与GetHashCode无关,但每次我运行它时,它都会在其他地方失败。很

我只是浪费了几个小时的调试时间,才意识到与.NET相反,在.NET内核中,GetHashCode在每次运行代码时都返回不同的值。 我完全理解这样做的理由。依赖哈希代码值是一个非常糟糕的主意(比如序列化它们)。我甚至记得微软的.NET内部版本(在Core之前)会改变每个版本的GetHashCode行为,所以没有人会对它感到太舒服

说到这里,我目前正在调试大量使用GetHashCode的复杂代码。我知道这个bug是我自己造成的,与GetHashCode无关,但每次我运行它时,它都会在其他地方失败。很烦人。
有没有一种方法可以强制GetHashCode像.NET中那样运行(在我调试时),而不必编写自己的哈希函数,也不必在代码中的任何地方替换它?

我发现,让string.GetHashCode在多个执行中返回可预测值的实用解决方案就是简单地切换回classic.NET(4.6)。由于我的代码没有.NETCore特定的内容,所以我唯一要做的工作就是创建一个新项目。我在.NET4.6下调试了我的代码,修复了错误并切换回Core。

仅根据框架的更改应更改哈希结果。我也偶然发现了这一点。我的解决方案是创建自己的哈希算法。只花了几分钟,因为我不需要任何花哨的东西

private static int GetSimpleHash(string s)
{
    return s.Select(a => (int)a).Sum();
}
顺便说一句,我为DotnetCore1.1提交了一个bug。(字符串)。GetHashCode()

更新

哈希可能会因框架或域而更改。这意味着同一程序的两次后续运行可能会返回不同的结果。
唉,我的bug报告没有实际意义,改为文档更新

更新更新


文档更新得更加清晰。

您是指
String.GetHashCode()
还是
Object.GetHashCode()
?我认为你根本无法影响后者;它总是基于对象引用,而对象引用从来都不是伪确定性的。前者在编译时和运行时受
FEATURE\u RANDOMIZED\u STRING\u HASHING
控制,但我不知道.NET Core是否尊重后者,只是默认情况下它肯定是启用的。我说的“编译时”,是指编译运行时,而不是您自己的应用程序。在您自己的代码中定义
FEATURE\u RANDOMIZED\u STRING\u HASHING
没有任何作用。但是.NET Core是开源的,如果涉及到这一点,您总是可以重建它。我的代码是泛型的,因此实际上它是object.GetHashCode(),但在我的示例中,对象是字符串,因此哈希代码基于(不可变的)字符串内容。