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