Как работать хэш в программировании?

Как хеши работают в программировании? Я считаю, что хэш - это то, что позволяет мне использовать некоторое уникальное значение для извлечения некоторых данных. Например, если у нас есть массив, и я начинаю вкладывать вещи в массив, если у меня есть другая переменная, которая отслеживает, какой элемент находится в слоте 0,1,2..., то у меня есть эта возможность мгновенно найти элемент. Это хеширование?

Какова цель хэша?

Когда должен быть реализован хэш? Какой хэш похож на структуру данных?

Я думаю, что я знаю о хэшах, так это то, что он позволяет нам извлекать элемент внутри O (1). Это правильно?

Ответ 1

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

Как будто у нас есть массив, и я начинаю помещать строки в массив, если у меня есть другая разновидность, которая отслеживает, какой элемент находится в слоте 0,1,2... тогда у меня есть эта способность мгновенно найти пункт. Это хеширование?

Нет. Хеш-функция - это детерминированная функция, которая всегда дает одно и то же значение для объекта. Хэш-код не изменяется в зависимости от того, где хранится объект.

Я думаю, что я знаю о хэшах, так это то, что он позволяет нам извлекать элемент внутри O (1). Это правильно?

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

Ответ 2

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

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

Теперь, в этом примере, если вы ищете кого-то в телефонной книге по имени, вы, вероятно, найдете их в O (log n), потому что имена сортируются в алфавитном порядке и потому, что вам нужно сделать двоичный поиск. Если, однако, вы вместо этого "хешировали" 100 человек, родившихся в 1900-х годах по годам их рождения, тогда вам понадобится не более 4 сравнений в хеш-таблице/телефонной книге (по одной на цифру), чтобы найти какой-либо год по хэшу, что постоянное время. Затем, если два человека родились в одном и том же вашем, вы можете использовать другую информацию, чтобы найти нужного вам человека, и в среднем, если ваша таблица не слишком заполнена (скажем, если у вас не более 50 человек в течение 100 разных лет рождения), ваши поисковые запросы будут постоянными.

(Если ваша таблица больше, чем, скажем, на 50% заполнена, вы всегда можете удвоить ее размер, чтобы количество столкновений было низким и, следовательно, чтобы ваши поисковые запросы были быстрыми.)


Дополнительная информация:

Если вы когда-либо слышали о хэшах SHA-2 MD5 или SHA-1 для файлов, они похожи на "отпечатки пальцев" файла. Хотя возможно иметь два файла с одинаковым хэшем, это делается настолько маловероятным, что для практических целей это невозможно; следовательно, если у вас есть хэш из двух файлов, вы можете сравнивать файлы по их отпечаткам пальцев, а не по их данным, что значительно быстрее.

Ответ 3

A hash ускоряет поиск, а не выполняет итерацию по массиву или дереву. Это позволяет искать время O(1) с небольшим использованием памяти.