我只是浪费了几个小时的调试才意识到与.NET相反,在.NET Core中,每次运行代码时GetHashCode都会返回不同的值。 我完全理解这个的基本原理。依赖哈希码值是一个非常糟糕的想法(比如序列化它们)。我甚至记得微软(在Core之前)的.NET内部版本会改变每个版本的GetHashCode的行为,以便没有人对它感到太满意。
说完这一切之后,我正在调试大量使用GetHashCode的复杂代码。我知道这个bug是我自己做的,与GetHashCode无关,但每次运行它都会失败。很烦人。 有没有办法强制GetHashCode像在.NET中一样(我在调试时),而不必编写自己的哈希函数,并且必须在我的代码中的任何地方替换它?
答案 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。