Go如何计算地图中键的哈希值?它是真正独一无二的,是否可用于其他结构?
我认为像int
或不可变string
这样的原始键很容易,但对于复合结构来说它似乎很重要。
答案 0 :(得分:10)
语言规范不说,这意味着它可以随时自由更改,或者在实现之间有所不同。
哈希算法在类型和平台之间有所不同。截至目前:在x86(32位或64位)上,如果CPU支持AES指令,则运行时使用aeshash
,一个基于AES原语的哈希,否则它使用一个功能"受到"的启发。 xxHash和cityhash,但两者都不同。 32位和64位系统有不同的变体。大多数类型使用其内存内容的简单散列,但浮点类型具有代码以确保0和-0散列相等(因为它们相同地比较)和NaN随机散列(因为两个NaN永远不相等)。由于复杂类型是由浮点数构建的,因此它们的哈希值由两个浮点部分的哈希值组成。接口的散列是存储在接口中的值的散列,而不是接口头本身。
答案 1 :(得分:3)
Go map实现使用名为aeshash
的哈希。它不是AES,但它使用aesenc汇编指令来计算哈希值。不会导出此哈希以在标准库中使用。
散列本身是用汇编语言编写的,可以在运行时包源中找到。