0

我在 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")
}

4

1 回答 1

2

据我所知/可以告诉,它不是。它使用 AES 指令来创建散列。您可能想查看类似https://github.com/cespare/mph的内容。

于 2021-10-09T11:16:35.753 回答