hob*_*bbs 10
语言规范没有说明,这意味着它可以随时更改,也可以在实现之间有所不同.
散列算法在类型和平台之间有所不同.截至目前:在x86(32位或64位)上,如果CPU支持AES指令,则运行时使用aeshash基于AES原语构建的散列,否则它使用"灵感来自"xxHash和cityhash的功能,但不同于任何一种.32位和64位系统有不同的变体.大多数类型使用其内存内容的简单散列,但浮点类型具有代码以确保0和-0散列相等(因为它们相同地比较)和NaN随机散列(因为两个NaN永远不相等).由于复杂类型是由浮点数构建的,因此它们的哈希值由两个浮点部分的哈希值组成.接口的散列是存储在接口中的值的散列,而不是接口头本身.
从Go 1.14开始,go标准库提供了hash/maphash包。这个包中的哈希函数不能保证与 Go 映射使用的哈希函数相同(但看起来它们是相同的,这是有道理的);他们是是实现哈希图等的良好函数。
hash/maphash 仅对字符串或字节切片进行操作,因此您仍然需要弄清楚如何将复合数据结构序列化为字节以用于散列目的。
Go map 实现使用一个名为aeshash. 它不是 AES,但它使用 aesenc 汇编指令来计算哈希。此散列未导出以用于标准库。
散列本身是用汇编编写的,可以在运行时包源中找到。