- •16. Хеширование. Постановка задачи, коэффициент заполнения таблицы.
- •18. Идеальная хеш-функция. Примеры хеш-функций (деление с остатком, середина квадрата и т.Д.)
- •19. Методы разрешения коллизий: внешние и внутренние цепочки, линейное и квадратичное опробование, смена системы счисления, применение суперпозиции двух «близких» хеш-функций.)
- •20. Рехеширование. Поведение зависимости числа коллизий от коэффициента заполнения в различных случаях (сравнение).
- •2.3.1. Линейное рехеширование
- •2.3.2. Случайное рехеширование
- •2.3.3. Рехеширование сложением
- •Эффективность операций в хеш - таблице
18. Идеальная хеш-функция. Примеры хеш-функций (деление с остатком, середина квадрата и т.Д.)
Хорошая функция преобразования ключей должна обеспечивать как можно более равномерное распределение ключей по всему диапазону значений индекса. Других ограничений на распределение нет, но на самом деле желательно, чтобы оно казалось совершенно случайным. Это свойство дало методу несколько ненаучное название хэширование (hashing от англ. «превращать в фарш» и «мешанина» - прим. перев.). Н называется хэш-функцией. Очевидно, эта функция должна допускать эффективное вычисление, то есть состоять из очень небольшого числа основных арифметических операций.
Идеальной хеш-функцией является такая hash-функция, которая для любых двух неодинаковых ключей дает неодинаковые адреса.
Подобрать такую функцию можно в случае, если все возможные значения ключей заранее известны. Такая организация данных носит название «совершенное хеширование» В случае заранее неопределенного множества значений ключей и ограниченной длины таблицы подбор совершенной функции затруднителен. Поэтому часто используют хеш-функции, которые не гарантируют выполнение условия.
Среди множества существующих хеш-функций принято выделять криптографически стойкие, применяемые в криптографии. Для того чтобы хеш-функция H считалась криптографически стойкой, она должна удовлетворять трем основным требованиям, на которых основано большинство применений хеш-функций в криптографии:
Необратимость: для заданного значения хеш-функции m должно быть вычислительно неосуществимо найти блок данных
,
для которого
.Стойкость к коллизиям первого рода: для заданного сообщения M должно быть вычислительно неосуществимо подобрать другое сообщение N, для которого
.Стойкость к коллизиям второго рода: должно быть вычислительно неосуществимо подобрать пару сообщений
,
имеющих одинаковый хеш.
Данные требования не являются независимыми:
Обратимая функция нестойка к коллизиям первого и второго рода.
Функция, нестойкая к коллизиям первого рода, нестойка к коллизиям второго рода; обратное неверно.
Следует отметить, что не доказано существование необратимых хеш-функций, для которых вычисление какого-либо прообраза заданного значения хеш-функции теоретически невозможно. Обычно нахождение обратного значения является лишь вычислительно сложной задачей.
метод деления. Некоторый целый ключ делится на размер таблицы и остаток от деления берется в качестве значения хеш-функции. Эта хеш-функция обозначается h (key) := key mod m.
метод середины квадрата. Ключ умножается сам на себя и в качестве индекса используется несколько средних цифр этого квадрата.
Function h(key: integer): integer; Begin Key:=key*key; {Возвести в квадрат} Key:=key shl 11;{Отбросить 11 младших бит} H:= key mod 1024;{Возвратить 10 младших бит} End;
3) Аддитивный метод для строк (размер таблицы равен 256). Для строк вполне разумные результаты дает сложение всех символов и возврат остатка от деления на 256.
Function h(st: string): integer; Var Sum: longint; I: integer; Begin For i:=0 to length(st) do Sum := sum + ord(st[i]); H:=sum mod 256; End;
