Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД / Uchpos / Gl_6.doc
Скачиваний:
28
Добавлен:
27.04.2015
Размер:
201.22 Кб
Скачать

Хэширование

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

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

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

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

Алгоритмы хеширования

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

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

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

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

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

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

Ключ возводится в квадрат. После этого из полученного результата выделяется число, состоящее из центральных цифр. Для получения номера участка достаточно умножить полученное число на соответствующую константу (в примере, рассмотренном выше, эта констан-та равна 0,7). Умножение на константу обеспечивает выравнивание адреса в соответствии с размером основной области. Например, пусть ключ записей состоит из шести цифр, а число участков в основной об-ласти равно 7000. Если ключ записи равен 172 148, то его квадрат равен 029 634 933 904. Четыре центральные цифры составляют число 3493. Номер участка равен 3493*0,7=2445.

2. Деление

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

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

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

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

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

4. Складывание

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

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

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

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

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

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

1*115+7*114+2*113+1*112+4*111+8 = 266373. Младшие разряды: 6373. Выравнивание адреса по размеру основной области выполняется путем умножения 6373 на 0,7, что дает номер участка, равный 4461.

При использовании данного метода необходимые расчеты выпол-няются на ЭВМ более быстро, чем при использовании методов склады-вания и сдвига разрядов.

7. Метод Лина

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

Рассмотрим пример. Ключ 172 148 поразрядно преобразуется в двоичную строку: 0001 0111 0010 0001 0100 1000. После этого осущест-вляется перегруппировка строки по три разряда: 000 101 110 010 000 101 001 000=05620510.

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

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

Цифра каждого разряда ключа рассматривается как коэффициент полинома; например, ключ 172 148 может быть представлен полиномом x5+7x4+2x3+x2+4x+8. Затем этот полином делится на некоторый заранее выбранный и неизменяемый полином.

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

Соседние файлы в папке Uchpos