В чем разница между организацией хеш-файла и организацией хеш-индекса?

Из концепций системы баз данных

Хеширование можно использовать для двух разных целей.

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

  • В организации хеш-индекса мы организуем ключи поиска и связанные с ними указатели в структуру хеш-файла.

Что означает «хеш-файловая структура»?

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


person Tim    schedule 18.06.2018    source источник


Ответы (1)


Представьте, что у вас есть две записи, одна с ключом «foo», а другая с ключом «bar». Скажем так, записи имеют фиксированную длину 64 байта, и что "foo" хеширует до 0x4000, а "bar" - до 0x0100.

В «организации хеш-файлов» у вас есть функция, которая принимает ключ поиска и напрямую вычисляет адрес. Таким образом, если вы добавите в файл «foo» и «bar», запись для «foo» начнется с адреса 0x4000 в файле, а запись «bar» начнется с адреса 0x0100 в файле.

Файл будет выглядеть примерно так:

Address Range         Contents
-------------         --------
0x0000 - 0x00FF       empty space
0x0100 - 0x013F       "bar" record
0x0140 - 0x3FFF       empty space
0x0400 - 0x403F       "foo" record

В «организации хеш-индекса» у вас есть вторичная структура данных - индекс, который сообщает вам, где начинается конкретная запись. Скажем, файл пуст и вы добавили «foo». Ваша хеш-функция вычисляет значение 0x4000. Вы добавляете это в индекс (хеш-карту или что-то подобное), и, поскольку файл пуст, присвоенное значение равно 0. Когда вы добавляете вторую запись, «bar», добавляется хеш-ключ 0x0100 и присваивается значение. это 0x0040. У вас есть индекс:

Key     Value
-------------
0x0100  0x0040
0x4000  0x0000

И файл выглядит так:

Address Range        Contents
-----------------------------
0x0000 - 0x003F      "foo" record
0x0040 - 0x007F      "bar" record

И, конечно, вы должны где-то хранить индекс. Это может быть в отдельном файле, или, возможно, в начале или в конце файла данных, или разбросано по всему файлу. Множество разных возможностей.

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

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

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

person Jim Mischel    schedule 18.06.2018
comment
Спасибо. Также признательны, если вы можете рассматривать stackoverflow.com/questions/50909435/ - person Tim; 18.06.2018