簡體   English   中英

使用SHA256的.Net核心字符串哈希

[英].Net core string hash using SHA256

您好,SO社區我需要一些哈希技術:

一些背景

我面臨着比較兩個對象列表的問題。 列表的一個實例在.Net Core 2.0應用程序中,而另一個在.Net 4.5.2應用程序中。

為了比較兩個列表(確保它們在兩個應用程序中都相同),我想計算列表的哈希值並在應用程序之間進行交換。 為了計算列表的哈希值,我正在使用此答案中描述的方法。

為此,您需要列表中對象的哈希碼,這就是我的問題所在:似乎眾所周知的事實(1) .Net核心對字符串使用隨機哈希碼行為 要計算對象的哈希碼,我需要包含字符串的哈希碼。

引出我的問題: 使用SHA256計算字符串的哈希值是個好主意嗎?

我想使用它的原因:

  • 相同的輸出大小(256位可以解釋為Int32)
  • SHA應該始終產生相同的輸出(也適用於將來的.Net / core版本)
  • 與自定義實現相比,在應用程序之間共享更容易

是否有更好的選擇(更有效,更輕松,更少的碰撞)?

由於大量的計算成本和使用這種哈希碼的收益非常低,可能不需要使用加密哈希函數。 僅需加法和乘法的一些基本哈希函數就足夠了-請參閱什么是重寫System.Object.GetHashCode的最佳算法? 例如用於數組/多個字段的良好哈希函數(類似於您已將問題鏈接到該字段)。 加密哈希函數的要求比通常將值放入哈希表或基本不等式檢查所需的條件要強得多。

筆記:

  • SHA256提供的位比常規GetHashCode所需的位多8倍(256與32)。 為了獲得有意義的收益,您需要更新其余代碼以計算256位哈希碼。
  • SHA256(和其他低溫算法)適用於字節數組-您必須將字符串轉換為字節數組才能計算哈希值,從而使其變得更慢。 此時,您可以考慮將整個數據結構序列化為字節數組,然后一次計算SHA256。
  • 除非您有一組有限的值,以便找到完美的哈希函數,否則始終必須處理沖突的可能性:相等的哈希碼並不意味着相等的值。 較長的哈希值將減少發生碰撞生日的可能性,因此您可能需要根據需要調整哈希碼的長度。
  • 如果您需要使哈希公開,SHA256是一種簡單的描述方法...但是您需要非常小心地說明如何將字符串轉換為字節數組(編碼是重要的一部分),以及在此之前是否需要任何規范化(包括String.Normalize )。

  • 考慮其他一些機制-可能是數據的版本控制或不可變的數據結構,以實現您要查找的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM