Когда мод математика быстра, быстрый хеш мод должен быть равен prime <= TARGET_TYPE_MAX
. Мод будет использовать все биты p
для формирования хеша.
При использовании наибольшего простого числа теряются только несколько ведер, но цель - скорость.
Пример, если целевой tpye равен uint32_t
, используйте 4294967291u.
Для целочисленных типов с изменяющимся размером, таких как int
, используйте макросы для выбора предварительно вычисленного простого числа. Простое число чуть меньше, чем степень двух .
#define LARGEST_PRIME8 251u
#define LARGEST_PRIME15 32749u
#define LARGEST_PRIME16 65521u
#define LARGEST_PRIME31 2147483647u
#define LARGEST_PRIME32 4294967291u
#define LARGEST_PRIME63 9223372036854775783u
#define LARGEST_PRIME64 18446744073709551557u
uint32_t hash = (uint32_t) ((uintptr_t)(void *)p) % LARGEST_PRIME32);