Куинн просто неправ, что ссылка на хэш ропота здесь бесполезна. Куинн прав, что вы хотите понять теорию хеширования. Ропот превращает большую часть этой теории в реализацию. Выяснение того, как применить эту реализацию к данному конкретному приложению, заслуживает изучения.
Некоторые из ключевых моментов здесь:
Пример функции из tcurdt предполагает, что «31» является хорошим множителем, потому что он является простым. Нужно показать, что простота является необходимым и достаточным условием. На самом деле 31 (и 7), вероятно, не особенно хорошие простые числа, потому что 31 == -1% 32. Нечетный множитель с примерно половиной установленных битов и половиной очищенных битов, вероятно, будет лучше. (Константа умножения хэша рота имеет это свойство.)
Этот тип хэш-функции, вероятно, будет сильнее, если после умножения значение результата будет скорректировано с помощью сдвига и xor. Умножение имеет тенденцию давать результаты большого количества битовых взаимодействий в верхнем конце регистра и низкие результаты взаимодействия в нижнем конце регистра. Shift и xor увеличивают взаимодействия в нижнем конце регистра.
Установка начального результата на значение, при котором около половины битов равны нулю, а около половины битов равны единице, также может оказаться полезным.
Может быть полезно внимательно следить за порядком, в котором элементы комбинируются. Вероятно, следует сначала обработать логические значения и другие элементы, где значения не сильно распределены.
Может быть полезно добавить пару дополнительных этапов скремблирования битов в конце вычисления.
Является ли хэш рота на самом деле быстрым для этого приложения, остается открытым вопросом. Шум бормотушек предварительно смешивает биты каждого входного слова. Несколько входных слов могут обрабатываться параллельно, что помогает многопоточному конвейерному процессору.