Golang的原生字符串哈希函数是完美的吗?

huangapple go评论77阅读模式
英文:

Is golang's native string hash function a perfect one?

问题

我已经在golang的源代码中找到了这个函数,并想知道它是否真的是一个完美的哈希函数。测试的方法是否正确?

package main

import (
	"fmt"
	"strconv"
	"unsafe"
)

//go:linkname strhash runtime.strhash
func strhash(p unsafe.Pointer, h uintptr) uintptr

const seed = 666
func main() {
	m := make(map[uintptr]string)
	for i := 0; i < 1000000000; i++ {
		key := strconv.Itoa(i)
		hash := strhash(unsafe.Pointer(&key), seed)
		_, exist := m[hash]
		if exist {
			fmt.Println("collision")
			break
		}
		m[hash] = key
	}

	fmt.Println("finish")
}

这段代码使用了strhash函数来计算字符串的哈希值,并将其作为键存储在一个map中。然后,它遍历了一个很大的范围,将整数转换为字符串,并计算哈希值。如果发生碰撞(即两个不同的字符串具有相同的哈希值),则输出"collision"并停止循环。最后,输出"finish"表示测试完成。

请注意,这段代码只是一个简单的测试,它并不能完全证明strhash函数是一个完美的哈希函数。要确定一个哈希函数是否完美,需要进行更全面的测试和分析。

英文:

I've found that function in the golang's source code and want to know whether it's truly a perfect hash function or not.
Is it the correct way to test that?


package main

import (
	&quot;fmt&quot;
	&quot;strconv&quot;
	&quot;unsafe&quot;
)

//go:linkname strhash runtime.strhash
func strhash(p unsafe.Pointer, h uintptr) uintptr

const seed = 666
func main() {
	m := make(map[uintptr]string)
	for i := 0; i &lt; 1000000000; i++ {
		key := strconv.Itoa(i)
		hash := strhash(unsafe.Pointer(&amp;key), seed)
		_, exist := m[hash]
		if exist {
			fmt.Println(&quot;collision&quot;)
			break
		}
		m[hash] = key
	}

	fmt.Println(&quot;finish&quot;)
}

答案1

得分: 3

据我所知,它不是使用AES指令来创建哈希值的。你可能想要查看类似于https://github.com/cespare/mph的东西。

英文:

As far as I know/can tell, it is not. It uses the AES instructions to create the hash. You might want to check out something like https://github.com/cespare/mph.

huangapple
  • 本文由 发表于 2021年10月9日 17:59:27
  • 转载请务必保留本文链接:https://go.coder-hub.com/69505661.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定