Dot-Net
如何為字元串列表計算一個好的雜湊碼?
背景:
- 我有一個簡短的字元串列表。
- 字元串的數量並不總是相同,但幾乎總是“少數”的數量級
- 在我們的數據庫中,將這些字元串儲存在第二個規範化表中
- 這些字元串一旦寫入數據庫就永遠不會改變。
我們希望能夠在查詢中快速匹配這些字元串,而不會因為執行大量連接而降低性能。
所以我正在考慮將所有這些字元串的雜湊碼儲存在主表中並將其包含在我們的索引中,因此只有當雜湊碼匹配時才會由數據庫處理連接。
那麼如何獲得一個好的雜湊碼呢?我可以:
- 將所有字元串的雜湊碼異或在一起
- Xor 與每個字元串後的結果相乘(例如乘以 31)
- 將所有字元串放在一起,然後獲取雜湊碼
- 其他方式
那麼人們是怎麼想的呢?
最後我只是連接字元串併計算連接的雜湊碼,因為它很簡單並且工作得很好。
(如果您關心我們使用的是 .NET 和 SqlServer)
蟲子!,蟲子!
引用Eric Lippert的 GetHashCode 指南和規則
System.String.GetHashCode 的文件特別指出,兩個相同的字元串在不同版本的 CLR 中可以具有不同的雜湊碼,事實上它們確實如此。不要在數據庫中儲存字元串雜湊並期望它們永遠相同,因為它們不會。
所以 String.GetHashcode() 不應該用於此。
標準的java實踐,就是簡單的寫
final int prime = 31; int result = 1; for( String s : strings ) { result = result * prime + s.hashCode(); } // result is the hashcode.