Какие хэш-функции по умолчанию используются языками программирования для словарей/ассоциативных массивов?

Поэтому мне стало любопытно, когда я узнал, что словари или ассоциативные массивы обычно реализуются с помощью хеш-таблиц. Прочитав о хеш-таблицах, я наткнулся на хэш-функции, я узнал, что существуют различные хеш-функции, такие как md5, md6, sha-1 и т. д. Чего я не смог найти, так это того, какая хэш-функция используется такими языками программирования, как python, C++. , Джава?


person Harris    schedule 26.08.2018    source источник
comment
Это... не та "хэш-функция" D:   -  person user2864740    schedule 27.08.2018
comment
С другой стороны, криптографический хеш предназначен для предоставления гораздо более строгие криптографические требования и выходное пространство.   -  person user2864740    schedule 27.08.2018
comment
Это криптографические хэш-функции, которые я знаю, но я хочу знать, какие из них используют языки программирования? Есть ли у них какое-либо имя или какая-либо идентичность, как у криптографического HF?   -  person Harris    schedule 27.08.2018
comment
Язык программирования использует не криптографическую функцию, а программу. Языки поддерживают различные функции (часто реализуемые через библиотеки).   -  person user2864740    schedule 27.08.2018
comment
Спецификация языка программирования (например, Go...) не требует конкретного хэша. функция. Некоторая конкретная реализация может иметь свою собственную. Многие реализации языков программирования являются бесплатными программами, поэтому вы можете погрузиться в их исходный код и изучить его.   -  person Basile Starynkevitch    schedule 27.08.2018
comment
@ user2864740 Я имел в виду ассоциативные массивы, которые являются важным аспектом большинства языков программирования.   -  person Harris    schedule 27.08.2018


Ответы (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) не предназначены для обеспечения «безопасности».

(Современные реализации хеш-таблиц часто применяют «функции смешивания» к сгенерированному хэш-значению, чтобы смягчить результаты вырожденных хеш-функций и/или атаки с отравлением данных.)

С другой стороны, криптографический хэш предназначен для предоставления гораздо более строгие криптографические требования и имеют гораздо большее пространство вывода. Хотя такой сильный хеш может использоваться для хеш-таблиц (после того, как он получен из объекта, а затем преобразован в хеш-сегмент), они также медленнее генерируются и обычно не нужны в контексте хэш/словарь.

Криптографические хэши обычно работают с произвольным фрагментом данных или потоком байтов.

Желательные характеристики хеш-таблицы:

  • Детерминированный
  • Равномерное распределение / предотвращение кластеризации
  • Скорость, скорость, скорость

Криптографические хэши имеют дополнительные характеристики помимо хэш-таблиц:

  • Невозможно сгенерировать сообщение из его хеш-значения
  • Невозможно найти два разных сообщения с одинаковым значением хеш-функции.
  • (Хотя криптографические хэши должны также быть быстрыми, скорость во многом второстепенна по сравнению с дополнительными требованиями.)

Языки программирования поддерживают широкий спектр различных криптографических хеш-функций через свои стандартные библиотеки и/или сторонние библиотеки. Более известный хэш (например, MD5/SHA-x), как правило, будет иметь универсальную поддержку, в то время как что-то более специализированное (например, MD6) может потребовать дополнительных усилий для поиска реализации.

С другой стороны, как показано выше, многие «функции» хэш-таблицы реализуются непосредственно на объектах, включенных в хэш-таблицу, в соответствии со стандартным шаблоном, а некоторые языки (и IDE) помогают сократить ручное кодирование. Например, C# предоставляет реализацию GetHashCode на основе отражения по умолчанию для типов структур.

person user2864740    schedule 26.08.2018
comment
Спасибо, это многое проясняет. Я также хотел выяснить, что основные функции по сути одинаковы, верно? только сложность, которая имеет значение. Я прав? - person Harris; 27.08.2018
comment
да, и дополнительная сложность (или больший пул) для криптографического хэша также гарантирует, что вероятность коллизий станет незначительной, что не так уж важно для словарного хэша. - person Harris; 27.08.2018
comment
Для хеш-таблицы существует относительно небольшой набор сегментов, поэтому эффективное распределение важнее, чем «меньше коллизий в изначально огромном, но свернутом/усеченном пространстве вывода». Ожидается, что криптографические хеш-функции будут хорошо распределены для других целей, но это не означает, что соответствующий некриптографический хэш не распределен достаточно хорошо. Некоторые реализации хеш-таблиц также будут работать смешивание хэшей для улучшения распространения. - person user2864740; 27.08.2018