Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭУМКД_БД_1.doc
Скачиваний:
15
Добавлен:
23.09.2019
Размер:
4.19 Mб
Скачать

2.5.5. Алгоритмы хэширования

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

  1. Если ключ не цифровой, он преобразуется в соответствующее цифровое представление таким образом, чтобы, исключить потерю информации, содержащейся в ключе. Например, буквенные знаки должны переводиться в цифровой код; допускается также представление символьного ключа в виде строки битов.

  1. Ключи (в цифровом или битовом представлении) преобразуются в совокупность произвольно распределённых чисел, значения которых имеют тот же порядок, что и значения адресов основной области памяти. Желательно, чтобы набор ключей был распределён как можно равномернее в диапазоне, переводимом в допустимые адреса.

  1. Полученные числа умножаются на константу, что позволяет разместить их строго в диапазоне значений адресов основной области. Например, пусть в результате выполнения этапа 2 мы получаем четырёхзначные числа, а в основной области имеется 7000 пакетов. Тогда четырёхзначные числа следует умножать на 0.7, что позволит распределить получаемые адреса в интервале от 0000 до 6999. Этот относительный номер участка преобразуется в машинный адрес участка.

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

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

Метод квадратов

Ключ возводится в квадрат. После этого из полученного результата выделяется число, состоящее из центральных цифр.

Для получения номера участка достаточно умножить полученное число на соответствующую константу (в примере, рассмотренном выше, эта константа равна 0.7).

Умножение на константу обеспечивает выравнивание адреса в соответствии с размером основной области.

Например, пусть ключ записей состоит из шести цифр, а число участков в основной области равно 7000. Если ключ записи равен 172 148, то его квадрат равен 029 634 933 904. Четыре центральные цифры составляют число 3493. Номер участка равен 3493*0.7=2445.

Деление

Данный метод, в основе которого лежит обычное деление чисел, даёт лучшие результаты, чем метод квадратов. Ключ делится на число, равное числу участков в основной области или близкое к нему. Делитель должен быть простым числом или числом, которое не содержит небольших сомножителей. Остаток от деления и даёт относительный адрес участка.

Например, если число участков равно 7000, то в качестве делителя можно использовать число 6997. Пусть ключ записи равен 172 148. Остаток от деления 172 148 на 6997, равный 4220, будет взят в качестве относительного адреса участка, в который направляется запись с ключом 172 148.

При использовании данного метода в область переполнения направляется меньшее число записей. Одна из причин этого заключается в том, что ключи часто задаются в определенной последовательности (например, возрастающей). Тогда и остатки от деления на число (например, на 6997) также будут иметь соответствующую последовательность, что обеспечит равномерное заполнение участков.

Сдвиг разрядов

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

Цифры, содержащиеся в перекрывающихся разрядах, суммируются, и результат, как и в первом методе, выравнивается в соответствии с диапазоном адресов участков.

Рассмотрим рисунок…

Рисунок 2.5.5.1 – Сдвиг разрядов

Складывание

Ключ разбивается на три части, средняя из которых равна длине адреса. Первая и третья части налагаются на вторую подобно тому, как складывается втрое лист бумаги; цифры суммируются, и результат, как и в предыдущем методе, выравнивается в соответствии с размером основной области. Этот метод наиболее удобен для преобразования больших ключей.

Рассмотрим на рисунке…

Рисунок 2.5.5.1 – Складывание

Анализ отдельных разрядов ключа

Для достижения равномерного распределения адресов участков можно использовать анализ распределения значений чисел и символов в каждом ключе.

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

Преобразование основания системы счисления

После преобразования системы счисления выделяются младшие разряды числа.

Рассмотрим пример (перевод в 11-ричную систему счисления). Пусть ключ равен 172 148. Тогда

1*11^5+7*11^4+2*11^3+1*11^2+4*11^1+8 = 266 373

Младшие разряды: 6373.

Выравнивание адреса: 6373*0.7 = 4461

Метод Лина

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

Рассмотрим пример. Ключ 172 148 поразрядно преобразуется в двоичную строку: 0001 0111 0010 0001 0100 1000.

После этого осуществляется перегруппировка строки по три разряда: 000 101 110 010 000 101 001 000=05 620 510.

Затем осуществляется деление числа 05 620 510 на константу q по правилам деления десятичных чисел. Остаток от деления даёт номер участка.

Деление полиномов

Цифра каждого разряда ключа рассматривается как коэффициент полинома.

Например, ключ 172 148 может быть представлен полиномом

1x^5+7x^4+2x^3+1x^2+4x^1+8x^0

Затем этот полином делится на некоторый заранее выбранный и неизменяемый полином.

Коэффициенты полинома – остатка от деления – образуют число, которое является относительным адресом участка.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]