Я работаю над быстрым 64-битным хешем.Многие существующие безопасные хеш-функции слишком медленные, некоторые некриптографические хеш-функции, такие как FNV, просто плохие.
Ну, я придумал FNV-подобный хеш:
UINT64 hash=0;
// for each input byte
hash=(hash^(input_byte+1))*HASH_PRIME;
Mainвопрос о HASH_PRIME
.Часто мы можем увидеть термин «золотое сечение» для мультипликативного хеширования.Для 64-битного хэша золотое сечение равно 0x9e3779b97f4a7c13
.
Я проверил 32-битное золотое сечение для периода в PRNG
:
DWORD hash=0;
// loop
hash=(hash^1)*0x9e3779b9;
rnd_out=hash>>24;
Хорошее значение здесь может привести кпериод 0xFFFFFFFF
- то есть максимально возможный.Это золотое сечение дает заметно меньший период.
или просто
DWORD hash=~0;
// loop
hash*=0x9e3779b9;
rnd_out=hash>>24;
И опять же, достаточно хороший множитель может дать период 0x3FFFFFFF
байтов.Золотое сечение здесь приводит к гораздо более короткому периоду.
Никогда не тестировал 64-битные простые числа - слишком дорого в вычислительном отношении.
Важен ли период для моего хэша?А где найти хороший 64-битный HASH_PRIMES
и как проверить такие вещи?