Метод деления
"При использовании метода деления мы обычно избегаем определенных значений m (размер таблицы). Например, m не должно быть степенью 2
, так как если m= 2<sup>p</sup>
, тогда h(k)
- это просто p
младших битов k
. "
- CLRS
Чтобы понять, почему m = 2<sup>p</sup>
использует только p
младшие биты k
, вы должны сначала понять хеш-функцию по модулю h(k) = k % m
.
Ключ может быть записан в виде отношения q
и остатка r
.
k = nq + r
Выбор отношения равным q = m
позволяет нам просто написать k % m
как остаток в вышеприведенном уравнении:
k % m = r = k - nm, where r < m
Следовательно, k % m
эквивалентно непрерывному вычитанию m
всего n
раз (до r < m
):
k % m = k - m - m - ... - m, until r < m
Давайте попробуем хешировать ключ k = 91
с помощью m = 2<sup>4</sup> = 16
.
91 = 0101 1011
- 16 = 0001 0000
----------------
75 = 0100 1011
- 16 = 0001 0000
----------------
59 = 0011 1011
- 16 = 0001 0000
----------------
43 = 0010 1011
- 16 = 0001 0000
----------------
27 = 0001 1011
- 16 = 0001 0000
----------------
11 = 0000 1011
Таким образом, 91 % 2<sup>4</sup> = 11
- это просто двоичная форма 91
с оставшимися только p=4
младшими битами.
Важное различие:
Это относится конкретно к методу деления хеширования.На самом деле, обратное утверждение верно для метода умножения , как указано в CLRS:
"Преимущество метода умножения состоит в том, что значение m не является критическим ...Обычно мы выбираем [m] как степень 2, поскольку мы можем легко реализовать эту функцию на большинстве компьютеров. "