猿问

go 如何计算映射中键的哈希值?

Go 如何计算映射中键的哈希值?它真的是独一无二的吗?是否可以在其他结构中使用?

我想像int或不可变的原始键很容易,string但对于复合结构来说似乎并不简单。


喵喔喔
浏览 229回答 2
2回答

翻翻过去那场雪

语言规范没有说,这意味着它可以随时自由更改,或者在实现之间有所不同。哈希算法在类型和平台之间有所不同。截至目前:在 x86(32 位或 64 位)上,如果 CPU 支持 AES 指令,则运行时使用aeshash基于 AES 原语构建的散列,否则它使用“受”xxHash 和 cityhash 启发的函数,但两者都不同。32 位和 64 位系统有不同的变体。大多数类型使用其内存内容的简单散列,但浮点类型具有代码以确保 0 和 -0 散列相等(因为它们比较相等)和 NaN 随机散列(因为两个 NaN 永远不相等)。由于复杂类型是从浮点数构建的,因此它们的散列由它们的两个浮点部分的散列组成。并且接口的散列是存储在接口中的值的散列,而不是接口标头本身。所有这些东西都在私有函数中,所以不,你不能在你自己的代码中访问 Go 的内部哈希值。

温温酱

Go 地图实现使用一个名为aeshash. 它不是 AES,但它使用 aesenc 汇编指令来计算哈希。此哈希不会导出以在标准库中使用。哈希本身是用汇编编写的,可以在运行时包源中找到。
随时随地看视频慕课网APP

相关分类

Go
我要回答