如何计算地图中键的哈希值?

时间:2016-06-04 01:26:09

标签: go

Go如何计算地图中键的哈希值?它是真正独一无二的,是否可用于其他结构?

我认为像int或不可变string这样的原始键很容易,但对于复合结构来说它似乎很重要。

2 个答案:

答案 0 :(得分:10)

  1. 语言规范不说,这意味着它可以随时自由更改,或者在实现之间有所不同。

  2. 哈希算法在类型和平台之间有所不同。截至目前:在x86(32位或64位)上,如果CPU支持AES指令,则运行时使用aeshash,一个基于AES原语的哈希,否则它使用一个功能"受到"的启发。 xxHash和cityhash,但两者都不同。 32位和64位系统有不同的变体。大多数类型使用其内存内容的简单散列,但浮点类型具有代码以确保0和-0散列相等(因为它们相同地比较)和NaN随机散列(因为两个NaN永远不相等)。由于复杂类型是由浮点数构建的,因此它们的哈希值由两个浮点部分的哈希值组成。接口的散列是存储在接口中的值的散列,而不是接口头本身。

  3. 所有这些东西都是私有函数,所以不,你不能在你自己的代码中访问Go的内部哈希值。

答案 1 :(得分:3)

Go map实现使用名为aeshash的哈希。它不是AES,但它使用aesenc汇编指令来计算哈希值。不会导出此哈希以在标准库中使用。

散列本身是用汇编语言编写的,可以在运行时包源中找到。