# #go #hash #perfect-hash
Вопрос:
Я нашел эту функцию в исходном коде 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(amp;key), seed)
_, exist := m[hash]
if exist {
fmt.Println("collision")
break
}
m[hash] = key
}
fmt.Println("finish")
}
Комментарии:
1. Идеальные хэш-функции определяются только для заданного набора возможных входных данных (каждая хэш-функция постоянного размера в конечном итоге приводит к столкновениям, если разрешены все входные данные, потому что существует бесконечное количество входных данных, но конечное количество выходных данных). Поскольку вы не указали ни одного, на ваш вопрос нельзя ответить. Однако, учитывая набор входных данных, вычисление выходных данных для каждого из них, безусловно, является одним из возможных способов убедиться в отсутствии коллизий.
2.встроенный тип карты реализует алгоритм, который обрабатывает конфликты, подробнее см. на hackernoon.com/some-insights-on-maps-in-golang-rm5v3ywh Учитывая, что эта функция ref используется для
map[string]...
cs.opensource.google/go/go/ /master:src/runtime/… Я думаю, что она не свободна от столкновений. Хотя на практике я не понимаю, как они формализуют доказательство в математическом аспекте этой вещи. Но тестирование на компьютере может быть выполнено только на подмножестве. В противном случае вам понадобится бесконечная память.
Ответ №1:
Насколько я знаю/могу судить, это не так. Он использует инструкции AES для создания хэша. Возможно, вы захотите проверить что-то вроде https://github.com/cespare/mph.