Почему это называется «хэш-таблица» или «хэш-функция»? Хэш не имеет никакого смысла для меня здесь [закрыто]

26

Сейчас около 4 лет разработки, которую я использую, слышу, говорю и реализую хеш-таблицы и хеш-функции. Но я действительно никогда не понимаю, почему это называется хэш?

Я помню первые дни, когда я начал программировать, этот термин был для меня довольно громоздким . Я так и не понял, что это, основываясь на его названии . Я просто экспериментально понял, что он делает и почему и когда мы должны его использовать .

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

Согласно моему словарю, хеш означает:

  1. Жареное блюдо из картофеля и мяса (крайне неактуально)
  2. символ # (знак номера AKA, знак фунта и т. д.) (все еще не имеет значения, может быть, просто неправильная номенклатура)
  3. Применить алгоритм к символьной строке (все еще не имеет ничего общего с уникальностью , которая является наиболее важной особенностью хэш-таблицы)
  4. Вырезать еду
  5. Еще один термин для гашиша

Кто-нибудь знает, почему это называется хэш?

Саид Нямати
источник
32
Вы, кажется, немного неправильно понимаете, что такое хэши. Уникальность явно не является особенностью хэш-функций (то есть они никогда не являются инъективными).
Питер Тейлор
1
@Peter Taylor: хеш-таблицы действительно определяют инъективные отображения.
фоторепортаж
2
@ Питер Тейлор: чтобы быть немного придирчивым, они не должны быть инъективными , но иногда они даже биективны. Подумайте о типичной реализации функции хеширования для целого числа :)
keppla
4
Хеш может быть уникальным, если либо пространство ключей не больше пространства значений хеш-функции (для хэшей таблиц), либо пространство значений хеш-значений настолько велико, что коллизии математически недопустимы (для криптографических хэшей).
Безопасное
1
Кроме того, «таблица ключей» больше похожа на любую структуру данных «ключ / значение» (также называемую «словарь»). Не все структуры данных ключ / значение являются хеш-таблицами.
Барджак

Ответы:

46

Согласно википедии, это относится к хэш-функции . Если вы хотите пойти дальше, на вики-странице для хэш-функции сказано, что использование слова «хэш» в хеш-функции возникло так:

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

user937146
источник
2
Не уверен, что там делают «субдомены». Просто хеш-функция тщательно «смешивает» значения своего домена.
фоторепортаж
15

На французском языке хеш-таблица называется «таблица de hachage», связанный глагол «hacher» означает измельчать / измельчать (в основном еда). Глагол to hashимеет то же значение в английском языке.

Как уже отмечали другие, это называется хешем, потому что вы разбиваете входные данные, которые вы разбиваете на части в разных местах (записи в таблице).

Ксавье Т.
источник
2
На самом деле написано «хачаге» и «хачер» без акцента.
Ptival
10

Номер 3 имеет все отношение к этому. Из Википедии :

В основе алгоритма хэш-таблицы лежит простой массив элементов; это часто просто называют хеш-таблицей . Алгоритмы хэш-таблицы вычисляют индекс по ключу элемента данных и используют этот индекс для помещения данных в массив. Реализация этого расчета является хэш - функции , f:

index = f(key, arrayLength)

Хеш-функция вычисляет indexвнутри массива из данных key. arrayLengthэто размер массива. Для ассемблера или других низкоуровневых программ тривиальная хеш-функция может часто создавать индекс только с одной или двумя встроенными машинными инструкциями .

Таким образом, хеш-таблица на самом деле не хранит значения, основанные на ключе; он хранит значения на основе хешированной версии этого ключа.

Мишель Тилли
источник
1
это зависит от того, что вы подразумеваете под хеш-таблицей. Структура данных, предлагаемая в таких языках, как Perl, Java и C #, дает вам отображение ключа к значению, используя тот тип хеш-таблицы, на который вы ссылаетесь внутренне.
14.09.11
10

Хеш-таблицы называются таким образом из-за использования хеш-кода, и это связано с «вырезать еду».

Подумайте об этом так: вы берете свой симпатичный симпатичный объект, как фрукт, затем хешируете его, чтобы он начал выглядеть точно так же, как и все остальное - просто число - в нем больше нет структуры. Этот кусок "нарезанной еды" используется в хэш-таблице, чтобы найти ваш симпатичный симпатичный объект.

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

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

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

back2dos
источник
Однако с оговоркой суперзлодей может также вернуть тот же хеш, что и супергерой с заданным набором параметров, поскольку хеширование, по-видимому, не диктует уникальность. В конце концов, есть хеш-коллизии ... это то, что вы делаете после коллизии ...
Rig