Зачем использовать хеш?

Когда вы впервые слышите о хешах (особенно если за плечами у вас долгая продуктивная карьера программирования на языках, в которых хеши не поддерживаются), может возникнуть вопрос: для чего нужны эти странные создания? Вообще говоря, они применяются тогда, когда один набор данных какQто связан с другим набором данных. Несколько примеров хешей, встречающихся в типичных приложениях Perl:

Имя, фамилия

Имя (ключ) используется для выборки фамилии (значение). Например, по ключу tom хеш вернет значение phoenix. Конечно, для этого имена должны быть уникальными; если в данных присутствуют два человека с именем randal, хеш работать не будет.

Имя хоста, IP-адрес
Вероятно, вы знаете, что каждый компьютер в Интернете обладает именем хоста (вида http://www.1111.com) и числовым IP-адресом вида 123.45.67.89. Компьютерам удобнее работать с числами, а люди предпочитают запоминать имена. Имена хостов являются уникальными строками и могут использоваться в качестве ключей хеша. По имени хоста программа находит соответствующий IP-адрес.

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


Обратите внимание: этот хеш не эквивалентен описанному в предыдущем примере; выборка в хешах производится только в одном направлении – от ключа к значению. Невозможно передать значение и получить соответствующий ему ключ! Таким образом, эти два хеша составляют пару: в одном хранятся IP-адреса, а в другом имен хостов. Впрочем, как вы вскоре увидите, при наличии одного хеша можно легко построить другой.

Слово, количество экземпляров
Очень типичное использование хеша. Оно настолько типично, что даже войдет в одно из упражнений в конце главы! Идея проста: вы хотите знать, сколько раз некоторое слово встречается в документе. Представьте, что вы индексируете группу документов, чтобы при поиске по строке fred узнать, что в одном документе строка fred встречается пять раз, в другом – семь, а в третьем не упоминается вовсе. Это позволит ранжировать документы по количеству вхождений. Когда программа индексации читает документ, при каждом обнаружении строки fred она увеличивает значение, связанное с ключом fred, на 1. Таким образом, если ранее строка fred дважды встречалась в документе, значение в хеше будет равно 2, а теперь оно увеличивается до 3. Если строка fred ранее не встречалась, значение изменяется с undef (значение по умолчанию) на 1.




Имя пользователя, количество [неразумно] используемых блоков на диске
Специально для системных администраторов: имена пользователей в системе уникальны, поэтому они могут использоваться в качестве ключей для получения информации о пользователе.

Номер водительских прав, имя
В мире существует великое множество людей по имени Джон Смит, но номера водительских прав у них разные. Номер образует уникальный ключ, а имя владельца – значение.

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

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Интерполяция элементов хеша
Обращение к элементам хеша
Присваивание хешей
Типичные операции с хешами
Функции keys и values

Вернуться в раздел: Perl / 5. Хеши