
- •Содержание
- •Введение
- •Общее представление о виртуальном хешировании
- •Методы разрешения коллизий
- •Виртуальное хэширования
- •Расщепление, использующее хеширование методом деления
- •Описание vh1
- •Поведение vh1
- •Применение
- •Хэширования паролей
- •Алгоритмы Основные принципы алгоритма виртуального хеширования.
- •Адресация записей
- •Заключение
- •Список литературы
Поведение vh1
Коэффициент загрузки
Предположение (2) подразумевает, что для любого x > αmaxbN/2, мы имеем α > αmin = amax/2. α достигает минимума после нового распределения и затем растет с x до следующего распределения. Согласно (3), это распределение имеет место, когда α > αmax и появилась первая коллизия. Если αmax ≈ 0.9 , то очень вероятно создание коллизии для новой вставки, и, таким образом, максимумы α будут практически равны αmax . Так как bN может быть небольшим, то значит, что практически для каждого x мы имеем αmax : 0.45 < α <= 0.9 . Это неравенство может быть справедливо даже для удалений, так как они могут представлять операцию, обратную расщеплению.
Доступ
По отношению к данными к проблемам может привести только размер битовой таблицы В. Однако, нам нужно относительного немного памяти для В, даже если Nb очень маленькое, а x очень большой. Например, для обычного b , скажем b = 20, N = 7 и αmax = 0.9 означает, что мы можем вставить до 0.9 * 20 * 7 * 213 = 1 032 132 записей за счет 7.2 Кб для В. Это значит, что для типичного ядра и x, не нужно обращаться к диску, чтобы вычислить адрес. Это обстоятельство принимается во внимание и дальше.
Рис. 3 показывает среднее количество
обращений к диску посредством удачного
поиска как функцию от количества вставок
x. Кривые следуют
из моделирования для
N = 7, αmax
= 0.9 и b = 1, 5,
20, 50. Для каждого b
файл достигнул уровня 12, т.е. количество
Nb записей, которые
могут быть найдены за один доступ
классическим хешированием, превысило
на 2048 (211) ! Кривые нарисованы в
линейном масштабе для каждого интервала
x так, что αmin
< αj
≤ αmax
и в масштабе log2
, когда возрастает j.
Фактически, любая такая область есть
множество x ,
которые предоставляет файл с уровнем
j. Некоторые значения для
уровня j = 10
представлены таблицей 1.
Рис.3
– Среднее количество обращений к диску
посредством удачного поиска после x
вставок. Во всех случаях хеширование,
выбранное при создании файла, могло
сохранить 7b прямых (первичных | начальных)
записей. Вставки увеличили это число
почти на 2048. Жирная линия показывает
уровень j = 10,
детально отраженный в таблице 1:
Получается следующее:
-
(x) начинается переходным состоянием, и продолжается устойчивым состоянием, где
периодическая функция от α. Уровень файла, соответствующий началу устойчивого состояния, уменьшается, когда растет b.
-
наихудший случай
(x) соответствует b = 1. Однако, эта производительность все еще превосходна, задавая для любого x,
(x) < 1.55 . Удивительно, в устойчивом состоянии
(x) фактически константа. Оба свойства обязаны тому факту, что b = 1, пропорция между переполнениями, которые несет VH1, и α максимальна.
-
доступ становится лучше, когда растет b. С одной стороны (таблица 1) наихудшее значение
(x) уменьшается (для b = 5 мы уже имеем
(x) < 1.26). С другой стороны, пропорция между α , такой что
(α)≈1, возрастает. Любопытно, что наибольшая амплитуда
(α) достигается для b = 10. Следует также обратить внимание, что для любого b наихудшее значение
(x) практически равно
(α=0.9) классического хеширования, в котором для разрешения коллизий используется метод «отдельного формирования цепочки».
-
Улучшение доступа понятно, так как когда растет b:
-
любая hj создает меньше коллизий, когда используется для вставок, и обходит переполнения лучше, когда используется для расщеплений.
-
α соответствует большему количеству коллизий, и, таким образом, расщепления должны следовать более близко за любым локальным максимумом
(x).
-
Пусть k – количество уровней j , таких, что как минимум один блок будет иметь уровень j . Это значит, что для l > k нет никаких блоков уровня j ≤ l-k , и, таким образом, первые 2l-k+1N–N биты таблицы B равны 1. Зная k , мы можем обойти эти биты, и, таким образом, размер B уменьшится. Если k = 1 , то нам вовсе не нужна таблица B , так как значения l , в этом случае, будет достаточно для хеширования.
Таблица 1 дает kmin и kmax для j = 10, т.е. для устойчивого состояния. Оба значения уменьшаются, когда растет b. Но по таблице это не значит, что пропорция α , где k ≠ kmin также уменьшается.
В
особенности для b =
50, мы имеем kmin
= 1 для α
[0.77 , 0.9] . Это означает, что в устойчивом
состоянии мы не нуждаемся в таблице B
для 30% возможных x.
Кроме того, только 10% блоков имеют
уровень l – 1 , если
α > 0.57 , т.е. 90% битов В равны 1.
Так как такие строки битов могут быть
легко уплотнены в намного меньшее
количество битов, то это значит, что для
73% возможных x нам
надо либо намного меньше, чем половина
В , либо В не нужна вовсе. Так как
kmax
= 2 для остальных x
, то это значит, что для оставшихся
27% x нам нужно и
вовсе только ¾ В .
-
через
’ мы обозначаем среднее число доступов на неудачный поиск. Моделирование показывает, что для
’ мы также имеем переходное и устойчивое состояние. Таблица 1 указывает минимальное и максимальное значение
’ для 10-ого уровня. Оба хуже, чем соответствующие значения для
. Стоит также обратить внимание, что самое плохое значение
’ увеличивается с b. Причина состоит в том, что
’ , соответствующий α = 0.9 , возрастает в случае классического хеширования, в котором для разрешения коллизий используется метод «отдельного формирования цепочки».
Наличие
устойчивого состояния подразумевает,
что
остается близким к 1 для любого x , до тех
пор, пока В в памяти. Таким образом, с
обычным ядром мы можем использовать j
≥ 12, т.е. мы можем вставить миллионы
записей, а
будет все еще оставаться близким к 1.
Так как α может оставаться высоким даже
для очень маленького x, то это значит,
что VH1 может эффективно работать с почти
любым количеством записей. В природе
нет классического хеширования с таким
свойством.