Dot-Net

‘int GetHashCode’ 是不是有點短視?

  • January 14, 2010

鑑於 .Net 能夠通過 IntPtr 檢測位(儘管通過反射器查看大量它被標記為不安全 - 恥辱)我一直認為 GetHashCode 返回一個 int 可能是短視的。

我知道最終使用一個好的散列算法,Int32 提供的數十億個排列是絕對足夠的,但即便如此,可能的散列集越窄,散列鍵查找越慢,因為需要更多的線性搜尋。

同樣——我是唯一一個覺得這很有趣的人嗎:

struct Int64{
 public override int GetHashCode()
 {
   return (((int) this) ^ ((int) (this >> 0x20)));
 }
}

而 Int32 只是簡單地返回this.

如果 IntPtr 由於性能問題而無法解決,那麼實現 IEquatable 等的 IHashCode 可能會更好?

隨著我們的平台在記憶體容量、磁碟大小等方面變得越來越大,32 位散列足夠的日子肯定已經屈指可數了嗎?

還是僅僅是通過介面抽像出散列或根據平台調整散列大小所涉及的成本超過了任何潛在的性能優勢?

Int64 雜湊函式用於確保考慮所有位 - 所以基本上它是將前 32 位與底部 32 位進行異或運算。我真的無法想像一個更好的通用型。(截斷為 Int32 是不好的——你怎麼能正確地散列低 32 位全為零的 64 位值?)

如果 IntPtr 被用作散列返回值,那麼程式碼將必須有條件分支(是 32 位嗎?是 64 位嗎?等等),這會減慢散列函式的速度,從而破壞整點。

我想說,如果你有一個實際上有 20 億個桶的雜湊表,那麼你可能正處於編寫整個自定義系統的階段。(可能數據庫會是更好的選擇?)在那個大小下,確保桶被均勻填充將是一個更緊迫的問題。(換句話說,一個更好的散列函式可能會比大量的桶支付更多的紅利)。

如果您確實想要記憶體中的多 GB 映射,那麼沒有什麼可以阻止您實現一個具有等效 64 位雜湊函式的基類。但是,您必須編寫自己的 Dictionary 等價物。

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