Поэтому мне стало любопытно, когда я узнал, что словари или ассоциативные массивы обычно реализуются с помощью хеш-таблиц. Прочитав о хеш-таблицах, я наткнулся на хэш-функции, я узнал, что существуют различные хеш-функции, такие как md5, md6, sha-1 и т. д. Чего я не смог найти, так это того, какая хэш-функция используется такими языками программирования, как python, C++. , Джава?
Какие хэш-функции по умолчанию используются языками программирования для словарей/ассоциативных массивов?
Ответы (1)
Это... не та "хэш-функция" D:
Для хэш-функций хеш-таблицы код должен вычислять соответствующий хэш на основе данные так, чтобы они соответствовали требованиям равенства. Он также должен быть «хорошо распределенным» и «быстрым». Таким образом, большинство хэш-таблиц часто представляют собой 32-битные значения с использованием той или иной формы вычислений с прокруткой/сдвигом. В конце дня этот хэш используется для выбора из намного меньшего пула сегментов.
Хэш-таблицы обычно вычисляются непосредственно (или с учетом) объектов, добавляемых в хеш-таблицу, то есть, как правило, криптографические хеш-функции не участвуют в хеш-таблицах. Типичная функция Java hashCode(), определенная на объект, добавляемый в хеш-таблицу, например, может выглядеть так:
int hash = 7;
hash = 31 * hash + (int) int_field;
hash = 31 * hash + (str_field == null ? 0 : str_field.hashCode());
// etc.
return hash;
Есть обсуждение выбора начальных значений и значений умножения в другом месте.. но вывод должен состоять в том, что большинство хеш-функций хеш-таблицы 1) напрямую вытекают из состояния объекта, применяя «настройки» по мере необходимости, и 2) не предназначены для обеспечения «безопасности».
(Современные реализации хеш-таблиц часто применяют «функции смешивания» к сгенерированному хэш-значению, чтобы смягчить результаты вырожденных хеш-функций и/или атаки с отравлением данных.)
С другой стороны, криптографический хэш предназначен для предоставления гораздо более строгие криптографические требования и имеют гораздо большее пространство вывода. Хотя такой сильный хеш может использоваться для хеш-таблиц (после того, как он получен из объекта, а затем преобразован в хеш-сегмент), они также медленнее генерируются и обычно не нужны в контексте хэш/словарь.
Криптографические хэши обычно работают с произвольным фрагментом данных или потоком байтов.
Желательные характеристики хеш-таблицы:
- Детерминированный
- Равномерное распределение / предотвращение кластеризации
- Скорость, скорость, скорость
Криптографические хэши имеют дополнительные характеристики помимо хэш-таблиц:
- Невозможно сгенерировать сообщение из его хеш-значения
- Невозможно найти два разных сообщения с одинаковым значением хеш-функции.
- (Хотя криптографические хэши должны также быть быстрыми, скорость во многом второстепенна по сравнению с дополнительными требованиями.)
Языки программирования поддерживают широкий спектр различных криптографических хеш-функций через свои стандартные библиотеки a> и/или сторонние библиотеки. Более известный хэш (например, MD5/SHA-x), как правило, будет иметь универсальную поддержку, в то время как что-то более специализированное (например, MD6) может потребовать дополнительных усилий для поиска реализации.
С другой стороны, как показано выше, многие «функции» хэш-таблицы реализуются непосредственно на объектах, включенных в хэш-таблицу, в соответствии со стандартным шаблоном, а некоторые языки (и IDE) помогают сократить ручное кодирование. Например, C# предоставляет реализацию GetHashCode на основе отражения по умолчанию для типов структур.