Dot-Net-Core

有沒有辦法讓 .NET Core GetHashCode 具有確定性

  • April 23, 2020

我只是浪費了幾個小時的調試時間,然後才意識到與 .NET 相反,在 .NET Core 中,每次執行程式碼時 GetHashCode 都會返回不同的值。我完全理解這樣做的理由。依賴雜湊碼值是一個非常糟糕的主意(比如序列化它們)。我什至記得 Microsoft 的 .NET 內部建構(在 Core 之前)會改變 GetHashCode 在每個建構中的行為,因此沒有人對它感到太舒服。

說了這麼多,我目前正在調試大量使用 GetHashCode 的複雜程式碼。我知道這個錯誤是我自己做的,與 GetHashCode 無關,但每次我執行它時,它都會在其他地方失敗。很煩人。有沒有辦法強制 GetHashCode 表現得像在.NET 中(在我調試時),而不必編寫我自己的雜湊函式並且不必在我的程式碼中的任何地方替換它?

我發現讓 string.GetHashCode 在多次執行中返回可預測值的實用解決方案只是切換回經典的 .NET (4.6)。由於我的程式碼沒有特定於 .NET Core 的內容,因此我要做的唯一工作就是創建一個新項目。我在 .NET 4.6 下調試了我的程式碼,修復了錯誤並切換回 Core。

根據文件,只有框架的更改才能更改雜湊結果。我也偶然發現了這一點。我的解決方案是創建自己的雜湊算法。只花了幾分鐘,因為我不需要任何花哨的東西。

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

在旁注中,我已經為 dotnet core 1.1 送出了一個錯誤。(string).GetHashCode()這裡

更新

由於框架或域,雜湊可能會發生變化。這意味著同一程序的兩次後續執行可能會返回不同的結果。

唉,我的錯誤報告沒有實際意義,而是改為文件更新。

更新更新

文件已更新為更加清晰。

引用自:https://stackoverflow.com/questions/41183507