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

Fra*_*nin 11 .net-core

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

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

Los*_*nos 5

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

private static int GetSimpleHash(string s)
{
    return s.Select(a => (int)a).Sum();
}
Run Code Online (Sandbox Code Playgroud)

在旁注中,我为 dotnet core 1.1 提交了一个错误。(string).GetHashCode()在这里

更新

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

更新更新

文档已更新,使其更加清晰。

  • 在这里插话一下,LosManos 给出的示例哈希码是非常有问题的,因为它极有可能产生哈希冲突。例如,如果为了相似性,我们假设 (int)a => 1 和 (int)b =>2 等,那么“ab”和“c”的哈希码都将为 3。有更好的哈希码算法可以避免这个问题。 (3认同)

Fra*_*nin -5

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