golang 原生的字符串哈希函数是完美的吗?
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")
}
据我know/can所知,事实并非如此。它使用 AES 指令来创建哈希。您可能想查看 https://github.com/cespare/mph.
之类的内容
我在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")
}
据我know/can所知,事实并非如此。它使用 AES 指令来创建哈希。您可能想查看 https://github.com/cespare/mph.
之类的内容