Go 如何計算映射中鍵的哈希值?它真的是獨一無二的嗎?是否可以在其他結構中使用?我想像int或不可變的原始鍵很容易,string但對于復合結構來說似乎并不簡單。
2 回答

翻翻過去那場雪
TA貢獻2065條經驗 獲得超14個贊
語言規范沒有說,這意味著它可以隨時自由更改,或者在實現之間有所不同。
哈希算法在類型和平臺之間有所不同。截至目前:在 x86(32 位或 64 位)上,如果 CPU 支持 AES 指令,則運行時使用
aeshash
基于 AES 原語構建的散列,否則它使用“受”xxHash 和 cityhash 啟發的函數,但兩者都不同。32 位和 64 位系統有不同的變體。大多數類型使用其內存內容的簡單散列,但浮點類型具有代碼以確保 0 和 -0 散列相等(因為它們比較相等)和 NaN 隨機散列(因為兩個 NaN 永遠不相等)。由于復雜類型是從浮點數構建的,因此它們的散列由它們的兩個浮點部分的散列組成。并且接口的散列是存儲在接口中的值的散列,而不是接口標頭本身。所有這些東西都在私有函數中,所以不,你不能在你自己的代碼中訪問 Go 的內部哈希值。

溫溫醬
TA貢獻1752條經驗 獲得超4個贊
Go 地圖實現使用一個名為aeshash
. 它不是 AES,但它使用 aesenc 匯編指令來計算哈希。此哈希不會導出以在標準庫中使用。
哈希本身是用匯編編寫的,可以在運行時包源中找到。
- 2 回答
- 0 關注
- 201 瀏覽
添加回答
舉報
0/150
提交
取消