Нет такой вещи, как «хорошая хеш-функция» для универсальных хешей (ред. Да, я знаю, что есть такая вещь, как «универсальное хеширование», но я не это имел в виду). В зависимости от контекста различные критерии определяют качество хэша. Два человека уже упоминали SHA. Это криптографический хеш, и он совсем не годится для хеш-таблиц, которые вы, вероятно, имеете в виду.
Хеш-таблицы имеют очень разные требования. Но все же найти хорошую хеш-функцию повсеместно сложно, потому что разные типы данных предоставляют разную информацию, которую можно хэшировать. Как правило, полезно учитывать всю информацию, которую тип содержит одинаково. Это не всегда легко или даже невозможно. По причинам статистики (и, следовательно, столкновения), также важно генерировать хороший разброс по проблемному пространству, то есть всем возможным объектам. Это означает, что при хешировании чисел от 100 до 1050 нецелесообразно позволять наиболее значимой цифре играть большую роль в хеше, потому что для ~ 90% объектов эта цифра будет равна 0. Гораздо важнее, чтобы последние три цифры определяют хеш.
Аналогично, при хешировании строк важно учитывать все символы - кроме случаев, когда заранее известно, что первые три символа всех строк будут одинаковыми; учитывая их, то это пустая трата времени.
Это на самом деле один из случаев, когда я советую прочитать то, что Кнут должен сказать в Искусство компьютерного программирования , том. 3. Еще одно хорошее чтение - Жюльен Уокер Искусство хеширования .