Две хорошие хеш-функции могут быть отображены в одно и то же пространство значений и, как правило, не вызовут каких-либо новых проблем в результате их объединения.
Итак, ваша хеш-функция может выглядеть так:
if it's an integer value:
return int_hash(integer value)
return string_hash(string value)
Если нет каких-либо скоплений ваших целых чисел вокруг определенных значений по модулю N, где N - возможное количество сегментов, то int_hash
может просто вернуть свой ввод.
Выбор хеш-строки не является новой проблемой. Попробуйте "djb2" (http://www.cse.yorku.ca/~oz/hash.html) или аналогичный, если у вас нет непристойных требований к производительности.
Не думаю, что есть смысл изменять хеш-функцию, чтобы учитывать общие префиксы. Если ваша хеш-функция хороша для начала, то маловероятно, что общие префиксы приведут к скоплению хеш-значений.
Если вы сделаете это, и хеш не будет работать неожиданно плохо, и вы поместите свои несколько миллионов значений хеш-функции в несколько тысяч сегментов, тогда совокупности блоков будут нормально распределены со средним значением (несколько миллионов / несколько тысяч). ) и дисперсия 1/12 (несколько тысяч) ^ 2
При среднем значении 1500 записей на группу это стандартное отклонение составляет примерно 430. 95% нормального распределения находится в пределах 2 стандартных отклонений от среднего, поэтому 95% ваших групп будут содержать 640-2360 записей, если только Я сделал мои суммы неправильно. Это достаточно, или вам нужны ведра более близких размеров?