Обоснование можно найти в оригинальном дизайне .
Многие хэш-функции стремятся иметь небольшую корреляцию между входными и выходными значениями. Они пытаются равномерно распределить выходные значения для очень похожих входов. Эта функция хэша не делает такой попытки. Фактически, для целых чисел результат функции хэша часто является просто входным значением. Таким образом, аналогичные, но разные значения ввода часто приводят к схожим, но различным значениям вывода. Это означает, что это не подходит как общая функция хэша. Например, таблица хэша может отбрасывать биты от функции хэша, что приводит к вероятным столкновениям, или может иметь плохое разрешение столкновения, когда значения хэша сгруппированы вместе. В таких случаях эта хэш-функция будет плохо преобразовываться.
Но стандарт не имеет такого требования для хэш-функции, он просто требует, чтобы хэши двух разных значений вряд ли сталкиваются. Контейнеры или алгоритмы, предназначенные для работы со стандартной функцией хэша, должны быть реализованы, чтобы хорошо работать, когда выход хэш-функции коррелируется с ее входом. Поскольку они платят эту стоимость, более качественная хэш-функция будет пустой.
Для других случаев использования, если вам нужна более качественная функция хэша, то ни стандартная функция хэша, ни boost::hash
не подходят. Есть несколько вариантов. Один из них - использовать второй хэш на выходе этой хэш-функции, такой как хэш-функция Томаша Ван. Это может не работать так хорошо, как хэш-алгоритм, предназначенный для ввода.
Для строк есть несколько быстрых, высококачественных хэш-функций (например MurmurHash3 и Google's CityHash), хотя они, как правило, более специфичны для машины. Они также могут быть подходящими для хэширования бинарного представления ваших данных - при условии, что все равные значения имеют равное представление, что не всегда так (например, для значений плавающей точки).