Забудьте о термине «лучший». Независимо от того, какой алгоритм хеширования кто-нибудь может придумать, если только у вас нет очень ограниченного набора данных, который нужно хешировать, каждый алгоритм, который в среднем работает очень хорошо, может стать совершенно бесполезным, если только получить правильное (или с вашей точки зрения) "неправильные") данные.
Вместо того, чтобы тратить слишком много времени на размышления о том, как сделать хэш более свободным от коллизий, не используя слишком много процессорного времени, я бы лучше подумал о том, «как сделать коллизии менее проблемными». Например. если каждое хеш-хранилище фактически является таблицей, и все строки в этой таблице (которые столкнулись) отсортированы в алфавитном порядке, вы можете искать в таблице сегментов с помощью бинарного поиска (который равен только O (log n)), а это означает, что даже когда в каждом втором хэш-контейнере есть 4 коллизии, ваш код все равно будет иметь приличную производительность (он будет немного медленнее по сравнению с таблицей без коллизий, но не намного). Одним из больших преимуществ здесь является то, что если ваша таблица достаточно велика и ваш хеш не слишком прост, две строки, приводящие к одному и тому же значению хеша, обычно выглядят совершенно по-разному (следовательно, бинарный поиск может прекратить сравнение строк после, в среднем, одного или двух символов) ; делает каждое сравнение очень быстрым).
На самом деле раньше у меня была ситуация, когда поиск непосредственно в отсортированной таблице с использованием бинарного поиска оказался быстрее, чем хеширование! Несмотря на то, что мой алгоритм хеширования был прост, для хэширования значений потребовалось довольно много времени. Тестирование производительности показало, что только если я получу более 700-800 записей, хеширование действительно быстрее, чем бинарный поиск. Тем не менее, поскольку таблица никогда не могла расти больше 256 записей в любом случае, а средняя таблица была ниже 10 записей, бенчмаркинг ясно показал, что в каждой системе, каждом ЦП бинарный поиск был быстрее. Здесь тот факт, что обычно уже сравнивался первый байт данных, был достаточен для того, чтобы привести к следующей итерации bsearch (поскольку раньше данные сильно отличались в первом байте от одного до двух), оказалось большим преимуществом.
Итак, подведем итог: я бы взял приличный алгоритм хеширования, который в среднем не вызывает слишком много коллизий и довольно быстрый (я бы даже принял еще несколько коллизий, если он просто очень быстрый!) И скорее оптимизировал бы Мой код, как получить наименьшее снижение производительности при возникновении коллизий (и они будут! Они будут, если только ваше хеш-пространство не станет равным или больше вашего пространства данных, и вы не сможете сопоставить уникальное хеш-значение с любым возможным набором данных).