Нет такой вещи, как «хорошая хэш-функция» для универсальных хэшей (ред. Да, я знаю, что существует такая вещь, как «универсальное хеширование», но это не то, что я имел в виду). В зависимости от контекста различные критерии определяют качество хэша. Два человека уже упоминают SHA. Это криптографический хеш, и это не совсем полезно для хеш-таблиц, которые вы, вероятно, имеете в виду.
Хэш-таблицы имеют очень разные требования. Но все же найти универсальную хэш-функцию сложно, потому что разные типы данных предоставляют различную информацию, которая может быть хэширована. Как правило, хорошо рассмотреть все информация тип имеет одинаковое значение. Это не всегда легко или даже возможно. По причинам статистики (и, следовательно, столкновения) важно также создать хорошее распространение по проблемному пространству, то есть все возможные объекты. Это означает, что при хэшировании чисел от 100 до 1050 не стоит допустить, чтобы самая значимая цифра играла большую роль в хэше, потому что для ~ 90% объектов эта цифра будет равна 0. Гораздо важнее, чтобы последние три цифры определяют хеш.
Аналогично, при хешировании строк важно учитывать все символы, за исключением случаев, когда заранее известно, что первые три символа всех строк будут одинаковыми; учитывая, что тогда это отходы.
Это на самом деле один из тех случаев, когда я советую прочитать, что должен сказать Кнут в: Искусство компьютерного программирования, vol. 3. Еще одним хорошим показателем является Жюльен Уокер The Art of Hashing.
Считаете ли вы использование одной или нескольких следующих хэш-функций общего назначения: http://www.partow.net/programming/hashfunctions/index.html –
В fnv_func тип p [i] является char, что произойдет с h после первой итерации? Было ли это сделано специально? –
@martinatime сказал: * В википедии имеется множество информации о хэш-функциях http://en.wikipedia.org/wiki/Hash_function и в нижней части этой статьи http://www.partow.net/programming/hashfunctions/ index.html имеет алгоритмы, реализованные на разных языках. * – 2501