有没有办法使.NET Core GetHashCode具有确定性

时间:2016-12-16 11:34:44

标签: .net-core

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

说完这一切之后,我正在调试大量使用GetHashCode的复杂代码。我知道这个bug是我自己做的,与GetHashCode无关,但每次运行它都会失败。很烦人。 有没有办法强制GetHashCode像在.NET中一样(我在调试时),而不必编写自己的哈希函数,并且必须在我的代码中的任何地方替换它?

2 个答案:

答案 0 :(得分:4)

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

private static int GetSimpleHash(string s)
{
    return s.Select(a => (int)a).Sum();
}

另一方面,我已经为dotnet核心1.1提交了一个错误。 (字符串).GetHashCode()here

<强>更新

由于框架或域,哈希值可能会发生变化。这意味着同一程序的两次后续运行可以返回不同的结果 唉,我的错误报告没有实际意义,而是改为文档更新。

更新更新

文档更新更加清晰。

答案 1 :(得分:0)

我发现使用string.GetHashCode在多次执行中返回可预测值的实用解决方案只是切换回经典.NET(4.6)。由于.NET Core没有特定于我的代码,我唯一需要做的工作就是创建一个新项目。我在.NET 4.6下调试了我的代码,修复了错误并切换回Core。