Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы и банки данных / Базы и банки данных (5 сем).doc
Скачиваний:
76
Добавлен:
01.05.2014
Размер:
705.54 Кб
Скачать

Расширяемое хеширование

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

Принцип работы расширяемого хеширования состоит в следующем.

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

  2. Хранимый файл имеет связанный с ним каталог, который также сохраняется на диске. Он состоит из заголовка, содержащего значениеd, которое называетсяглубиной каталога, а также 2dуказателей на страницы с несколькими записями данных на каждой. Таким образом, с помощью каталога глубинойdможно организовать управление файлом, содержащим 2dразличных страниц с данными.

  3. Если рассматривать первые dбит псевдоключа как целое беззнаковое числоb, тоi-й указатель в каталоге (1i2d) будет относиться к странице, содержащей все записи, для которых величинаbравнаi1. Иначе говоря, первый указатель будет относиться к странице с записями, у которыхbсоставлено из нулей, второй указательна страницу с записями, у которыхbравно 0…01, и т.д. теперь, для того, чтобы найти запись со значением ключевого поля, равнымk, нужно с помощью хеш-функции вычислить значение псевдоключаs, затем по первымdбит псевдоключа определить численное значениеi1 и найти в каталоге (первый доступ к диску) соответствующий емуi-й указатель на страницу, содержащую искомую запись (второй доступ к диску). Замечание. Поскольку каталог обычно имеет достаточно малый размер, его можно разместить в оперативной памяти и сократить число обращений к диску.

  4. Каждая страница имеет заголовок с указанием локальной глубины рэтой страницы (рd). Пустьdравно трем и первый указатель в каталоге указывает на страницу с локальной глубинойр, равной двум (рис.6). равенство локальной глубины двум означает, что страница содержит не только записи со значениями псевдоключа 000, но и со значениями 00 (например, 000 и 001). Иначе говоря, указатель каталога 001 также указывает на эту страницу.

  5. Теперь предположим, что требуется вставить еще одну запись с псевдоключом 000 (или 001) на полностью заполненную страницу 000. В таком случае страница будет разделена на две части с увеличенной на единицу локальной глубиной. Одна из частей (старая страница будет содержать все записи с псевдоключами 000, и на нее будет указывать указатель 000, а в другую часть (новую страницу) будут перемещены все записи с псевдоключами 001, и на нее будет указывать указатель 001.

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

Каталог Страницы с данными

Глубина

3

2

Локальная глубина:

Первые два бита 00

Указатель 000

Указатель 001

Указатель 010

3

Локальная глубина:

Первые два бита 010

Указатель 011

Указатель 100

Указатель 101

3

Локальная глубина:

Первые два бита 011

Указатель 110

Указатель 111

1

Локальная глубина:

Первый бит равен 1

Рис.6. Пример реализации расширяемого хеширования