英文:
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 (
"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")
}
答案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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论