Универсальное семейство хеш-функций — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (rollbackEdits.php mass rollback)
 
(не показаны 34 промежуточные версии 10 участников)
Строка 1: Строка 1:
==Универсальное семейство хеш-функций==
+
==Определение==
Качественная хеш-функция удовлетворяет (приближенно) простого равномерного хеширования: для каждого ключа, независимо от хеширования других ключей, равновероятно помещение его в любую из <tex> m </tex> ячеек. Но это условие обычно невозможно проверить, так как распределение вероятностей, с которыми поступают входные данные, как правило, неизвестно. К тому же, вставляемые ключи могут и не быть независимыми.
+
 
 +
Качественная хеш-функция (англ. ''hash function'') удовлетворяет (приближенно) условию простого равномерного [[Хеширование|хеширования]]: для каждого ключа, независимо от хеширования других ключей, равновероятно помещение его в любую из <tex> m </tex> ячеек. Но это условие обычно невозможно проверить, так как распределение вероятностей, с которыми поступают входные данные, как правило, неизвестно. К тому же, вставляемые ключи могут и не быть независимыми. Если наш противник будет умышленно выбирать ключи для хеширования при помощи конкретной хеш-функции, то при некоторых реализациях хеш-таблиц может получиться так, что все ключи будут записаны в одну и ту же ячейку таблицы, что приведет к среднему времени выборки <tex> \Theta(n) </tex>. Таким образом,  любая фиксированная хеш-функция становится уязвимой. И единственный эффективный выход из данной ситуации {{---}} случайный выбор хеш-функции. Такой подход называется универсальным хешированием. Он гарантирует хорошую производительность в среднем, вне зависимости от данных, выбранных нашим противником.
 +
 
 +
{{Определение
 +
|definition=
 +
Пусть <tex> H </tex> {{---}} конечное множество хеш-функций, которые отображают пространство ключей <tex>\ U </tex> в диапазон <tex> \{0, 1, 2, .. , m - 1\} </tex>.
 +
Такое множество называется '''универсальным''' (англ.  ''universal''), если для каждой пары ключей <tex> k, l \in U, (k\ne l)</tex> количество хеш-функций <tex> h \in H </tex>, для которых <tex> h(k) = h(l) </tex> не превышает <tex dpi = "180"> \frac{|H|}{m} </tex>.
 +
}}
 +
 
 +
Иными словами, при случайном выборе хеш-функции из <tex> H </tex> вероятность коллизии между различными ключами <tex> k, l </tex> не превышает вероятности совпадения двух случайным образом выбранных хеш-значений из множества <tex> \{0, 1, 2, .. , m - 1\} </tex>, которая равна <tex dpi = "180"> \frac{1}{m} </tex>.
 +
 
 +
==Построение универсального множества хеш-функций==
 +
{{Теорема
 +
|statement=
 +
Множество хеш функций <tex>H_{p,m}=\{h_{a,b}:a\in Z_p^*,b\in Z_p\}</tex>, где <tex>h_{a,b}(k)=((ak+b)\bmod p)\bmod m</tex>, <tex>Z_p^*=\{1,2,\dots,p-1\}</tex>, <tex>Z_p=\{0,1,\dots,p-1\}</tex>, <tex>p</tex> {{---}} простое число, является универсальным.
 +
|proof=
 +
Рассмотрим <tex>k,l\in Z_p:k\ne l</tex>. Пусть для данной хеш-функции <tex>h_{a,b}</tex>
 +
 
 +
<tex>r=(ak+b)\bmod p</tex>,
 +
 
 +
<tex>s=(al+b)\bmod p</tex>.
 +
 
 +
<tex>r\ne s</tex>, так как <tex>r-s\equiv a(k-l)\pmod p</tex>, а <tex>p</tex> {{---}} простое число, <tex>a</tex> и <tex>(k-l)</tex> не равны нулю по модулю <tex>p</tex>. Значит, произведение <tex>r</tex> и <tex>s</tex> также отлично от нуля по модулю <tex>p</tex>. Таким, образом, коллизии "по модулю <tex>p</tex>" отсутствуют. Более того, каждая из <tex>p(p-1)</tex> возможных пар <tex>(a,b)</tex>, приводят к различным парам <tex>(r,s):r\ne s</tex>. Чтобы доказать это, достаточно рассмотреть возможность однозначного определения <tex>a</tex> и <tex>b</tex> по заданным <tex>r</tex> и <tex>s</tex>:
 +
 
 +
<tex>a=\left((r-s)((k-l)^{-1}\bmod p)\right)\bmod p,\ b=(r-ak)\bmod p</tex>.
 +
 
 +
Поскольку имеется только <tex>p(p-1)</tex> возможных пар <tex>(r,s):r\ne s</tex>, то имеется взаимнооднозначное соответствие между парами <tex>(a,b)</tex> и парами <tex>(r,s):r\ne s</tex>. Таким образом, для любых <tex>k,l</tex> при равномерном случайном выборе пары <tex>(a,b)</tex> из <tex>Z_p^*\times Z_p</tex>, получаемая в результате пара <tex>(r,s)</tex> может быть с равной вероятностью любой из пар с отличающимися значениями по модулю <tex>p</tex>.
 +
 
 +
Отсюда следует, что вероятность того, что различные ключи <tex>k,l</tex> приводят к коллизии, равна вероятности того, что <tex>r\equiv s\pmod m</tex> при произвольном выборе отличающихся по модулю <tex>p</tex> значений <tex>r</tex> и <tex>s</tex>. Для данного <tex>r</tex> имеется <tex>p-1</tex> возможное значение <tex>s</tex>. При этом число значений <tex>s:s\ne r</tex> и <tex>s\equiv r\pmod p</tex>, не превышает
 +
 
 +
<tex dpi = "150">\left\lceil \frac{p}{m}\right\rceil-1\le\frac{p+m-1}{m}-1=\frac{p-1}{m}</tex>.
 +
 
 +
Вероятность того, что <tex>s</tex> приводит к коллизии с <tex>r</tex> при приведении по модулю <tex>m</tex>, не превышает <tex dpi = "150">\frac{p-1}{m}\cdot\frac{1}{p-1}=\frac{1}{m}</tex>.
 +
 
 +
Значит, <tex dpi = "150">\forall k\ne l\in Z_p\ P(h_{a,b}(k)=h_{a,b}(l))\le\frac{1}{m}</tex>, что означает, что множество хеш-функций <tex>H_{p,m}</tex> является универсальным.
 +
}}
 +
 
 +
== Попарная независимость ==
 +
 
 +
{{Определение
 +
|definition=
 +
Пусть <tex> H </tex> {{---}} универсальное семейство хеш-функций.
 +
Говорят что оно обладает свойством '''попарной независимости'''(англ. ''pairwise independence''), если при фиксированных <tex> x, y</tex>  <tex> (0 \le x, y \le m-1)</tex> для каждой пары ключей <tex> k, l \in U (k\ne l) </tex>  вероятность того, что <tex> h(k) = x </tex>  и  <tex> h(l) = y </tex>, равна  <tex dpi = "150"> \frac{1}{m^2} + o(\frac{1}{m^2}) </tex>.
 +
}}
 +
 
 +
==Построение попарно независимого множества хеш-функций==
 +
{{Теорема
 +
|statement=
 +
Семейство хеш функций, описанное выше, также является попарно независимым.
 +
|proof=
 +
Для функции <tex>h_{a,b}</tex> получаем
 +
 
 +
<tex>x = (ak+b)\bmod p \bmod m</tex>
 +
 
 +
<tex>y = (al+b)\bmod p \bmod m</tex>
 +
 
 +
Выразим отсюда <tex>a</tex> и <tex>b</tex>. Вычтя из первого уравнения второе, получим:
 +
 
 +
<tex>x - y = a(k - l)\bmod p \bmod m</tex>
 +
 
 +
Теперь сначала первое домножим на <tex>l</tex>, и второе на <tex>k</tex>. Вычитаем:
 +
 
 +
<tex>lx - ky = b(l - k)\bmod p \bmod m</tex>
 +
 
 +
Запишем иначе:
 +
 
 +
<tex>x - y \equiv a(k - l)+im \pmod p</tex>
 +
 
 +
<tex>lx - ky \equiv b(l - k)+jm \pmod p</tex>,
 +
 
 +
где <tex dpi = "135"> 0 \le i, j < \lfloor \frac{p}{m} \rfloor </tex>.
 +
 
 +
Стоит отметить, что эти равенства мы считаем выполненными, если при данных <tex>a, b, x</tex> и <tex>y</tex> и '''каких-либо''' <tex>i</tex> и <tex>j</tex> они будут верными (исходя из того как мы их получили).
 +
 
 +
<tex>k \ne l</tex>, <tex>p</tex> {{---}} простое, тогда
 +
 
 +
<tex>a \equiv (k - l)^{-1}(x - y - im) \pmod p</tex>
 +
 
 +
<tex>b \equiv (l - k)^{-1}(lx - ky - jm)</tex>  <tex>\pmod p</tex>
 +
 
 +
Теперь заметим, что <tex>a</tex> принимает <tex>p</tex> различных значений, а <tex>i</tex> {{---}} <tex dpi = "130">\lfloor \frac{p}{m} \rfloor</tex> значений. Понятно, что для заданных <tex>x, y</tex> и <tex>a</tex> с вероятностью лишь  <tex dpi = "130"> \frac{1}{m} </tex>  найдётся <tex>i</tex>, обращающий первое равенство в тождество; аналогично и со вторым равенством. 
 +
 
 +
Остаётся подытожить наши выкладки.
 +
 
 +
<tex>P( [x = (ak+b)\bmod p \bmod m]</tex>  <tex>\wedge</tex>  <tex>[y = (al+b)\bmod p \bmod m])</tex>
 +
<tex>=</tex>
 +
 
 +
<tex>=</tex>
 +
<tex>P( [a \equiv (k - l)^{-1}(x - y - im)</tex>  <tex>\pmod p]</tex>  <tex>\wedge</tex>  <tex>[b \equiv (l - k)^{-1}(lx - ky - jm)</tex>  <tex>\pmod p])</tex>
 +
<tex>=</tex>
 +
 
 +
<tex>=</tex>
 +
<tex>P( a \equiv (k - l)^{-1}(x - y - im)</tex>  <tex>\pmod p)</tex>  <tex>\cdot</tex>  <tex>P( b \equiv (l - k)^{-1}(lx - ky - jm)</tex>  <tex>\pmod p)</tex>
 +
<tex>=</tex>
 +
 
 +
<tex>=</tex>
 +
<tex dpi = "130">(\frac{1}{m} + o(\frac{1}{m})) \cdot (\frac{1}{m} + o(\frac{1}{m})) = \frac{1}{m^2} + o(\frac{1}{m^2})</tex>
 +
 
 +
Переход к третьей строчке объясняется тем, что события, объединённые знаком <tex>\wedge</tex>, независимы (т.к. случайные величины здесь только <tex>a</tex> и <tex>b</tex>; <tex>x, y, k, l</tex> {{---}} фиксированы).
 +
}}
 +
 
 +
==Источники информации==
 +
 
 +
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2005. — с. 294. — ISBN 5-8459-0857-4
 +
 
 +
[[Категория: Дискретная математика и алгоритмы]][[Категория:Хеширование]]

Текущая версия на 19:12, 4 сентября 2022

Определение

Качественная хеш-функция (англ. hash function) удовлетворяет (приближенно) условию простого равномерного хеширования: для каждого ключа, независимо от хеширования других ключей, равновероятно помещение его в любую из [math] m [/math] ячеек. Но это условие обычно невозможно проверить, так как распределение вероятностей, с которыми поступают входные данные, как правило, неизвестно. К тому же, вставляемые ключи могут и не быть независимыми. Если наш противник будет умышленно выбирать ключи для хеширования при помощи конкретной хеш-функции, то при некоторых реализациях хеш-таблиц может получиться так, что все ключи будут записаны в одну и ту же ячейку таблицы, что приведет к среднему времени выборки [math] \Theta(n) [/math]. Таким образом, любая фиксированная хеш-функция становится уязвимой. И единственный эффективный выход из данной ситуации — случайный выбор хеш-функции. Такой подход называется универсальным хешированием. Он гарантирует хорошую производительность в среднем, вне зависимости от данных, выбранных нашим противником.


Определение:
Пусть [math] H [/math] — конечное множество хеш-функций, которые отображают пространство ключей [math]\ U [/math] в диапазон [math] \{0, 1, 2, .. , m - 1\} [/math]. Такое множество называется универсальным (англ. universal), если для каждой пары ключей [math] k, l \in U, (k\ne l)[/math] количество хеш-функций [math] h \in H [/math], для которых [math] h(k) = h(l) [/math] не превышает [math] \frac{|H|}{m} [/math].


Иными словами, при случайном выборе хеш-функции из [math] H [/math] вероятность коллизии между различными ключами [math] k, l [/math] не превышает вероятности совпадения двух случайным образом выбранных хеш-значений из множества [math] \{0, 1, 2, .. , m - 1\} [/math], которая равна [math] \frac{1}{m} [/math].

Построение универсального множества хеш-функций

Теорема:
Множество хеш функций [math]H_{p,m}=\{h_{a,b}:a\in Z_p^*,b\in Z_p\}[/math], где [math]h_{a,b}(k)=((ak+b)\bmod p)\bmod m[/math], [math]Z_p^*=\{1,2,\dots,p-1\}[/math], [math]Z_p=\{0,1,\dots,p-1\}[/math], [math]p[/math] — простое число, является универсальным.
Доказательство:
[math]\triangleright[/math]

Рассмотрим [math]k,l\in Z_p:k\ne l[/math]. Пусть для данной хеш-функции [math]h_{a,b}[/math]

[math]r=(ak+b)\bmod p[/math],

[math]s=(al+b)\bmod p[/math].

[math]r\ne s[/math], так как [math]r-s\equiv a(k-l)\pmod p[/math], а [math]p[/math] — простое число, [math]a[/math] и [math](k-l)[/math] не равны нулю по модулю [math]p[/math]. Значит, произведение [math]r[/math] и [math]s[/math] также отлично от нуля по модулю [math]p[/math]. Таким, образом, коллизии "по модулю [math]p[/math]" отсутствуют. Более того, каждая из [math]p(p-1)[/math] возможных пар [math](a,b)[/math], приводят к различным парам [math](r,s):r\ne s[/math]. Чтобы доказать это, достаточно рассмотреть возможность однозначного определения [math]a[/math] и [math]b[/math] по заданным [math]r[/math] и [math]s[/math]:

[math]a=\left((r-s)((k-l)^{-1}\bmod p)\right)\bmod p,\ b=(r-ak)\bmod p[/math].

Поскольку имеется только [math]p(p-1)[/math] возможных пар [math](r,s):r\ne s[/math], то имеется взаимнооднозначное соответствие между парами [math](a,b)[/math] и парами [math](r,s):r\ne s[/math]. Таким образом, для любых [math]k,l[/math] при равномерном случайном выборе пары [math](a,b)[/math] из [math]Z_p^*\times Z_p[/math], получаемая в результате пара [math](r,s)[/math] может быть с равной вероятностью любой из пар с отличающимися значениями по модулю [math]p[/math].

Отсюда следует, что вероятность того, что различные ключи [math]k,l[/math] приводят к коллизии, равна вероятности того, что [math]r\equiv s\pmod m[/math] при произвольном выборе отличающихся по модулю [math]p[/math] значений [math]r[/math] и [math]s[/math]. Для данного [math]r[/math] имеется [math]p-1[/math] возможное значение [math]s[/math]. При этом число значений [math]s:s\ne r[/math] и [math]s\equiv r\pmod p[/math], не превышает

[math]\left\lceil \frac{p}{m}\right\rceil-1\le\frac{p+m-1}{m}-1=\frac{p-1}{m}[/math].

Вероятность того, что [math]s[/math] приводит к коллизии с [math]r[/math] при приведении по модулю [math]m[/math], не превышает [math]\frac{p-1}{m}\cdot\frac{1}{p-1}=\frac{1}{m}[/math].

Значит, [math]\forall k\ne l\in Z_p\ P(h_{a,b}(k)=h_{a,b}(l))\le\frac{1}{m}[/math], что означает, что множество хеш-функций [math]H_{p,m}[/math] является универсальным.
[math]\triangleleft[/math]

Попарная независимость

Определение:
Пусть [math] H [/math] — универсальное семейство хеш-функций. Говорят что оно обладает свойством попарной независимости(англ. pairwise independence), если при фиксированных [math] x, y[/math] [math] (0 \le x, y \le m-1)[/math] для каждой пары ключей [math] k, l \in U (k\ne l) [/math] вероятность того, что [math] h(k) = x [/math] и [math] h(l) = y [/math], равна [math] \frac{1}{m^2} + o(\frac{1}{m^2}) [/math].


Построение попарно независимого множества хеш-функций

Теорема:
Семейство хеш функций, описанное выше, также является попарно независимым.
Доказательство:
[math]\triangleright[/math]

Для функции [math]h_{a,b}[/math] получаем

[math]x = (ak+b)\bmod p \bmod m[/math]

[math]y = (al+b)\bmod p \bmod m[/math]

Выразим отсюда [math]a[/math] и [math]b[/math]. Вычтя из первого уравнения второе, получим:

[math]x - y = a(k - l)\bmod p \bmod m[/math]

Теперь сначала первое домножим на [math]l[/math], и второе на [math]k[/math]. Вычитаем:

[math]lx - ky = b(l - k)\bmod p \bmod m[/math]

Запишем иначе:

[math]x - y \equiv a(k - l)+im \pmod p[/math]

[math]lx - ky \equiv b(l - k)+jm \pmod p[/math],

где [math] 0 \le i, j \lt \lfloor \frac{p}{m} \rfloor [/math].

Стоит отметить, что эти равенства мы считаем выполненными, если при данных [math]a, b, x[/math] и [math]y[/math] и каких-либо [math]i[/math] и [math]j[/math] они будут верными (исходя из того как мы их получили).

[math]k \ne l[/math], [math]p[/math] — простое, тогда

[math]a \equiv (k - l)^{-1}(x - y - im) \pmod p[/math]

[math]b \equiv (l - k)^{-1}(lx - ky - jm)[/math] [math]\pmod p[/math]

Теперь заметим, что [math]a[/math] принимает [math]p[/math] различных значений, а [math]i[/math][math]\lfloor \frac{p}{m} \rfloor[/math] значений. Понятно, что для заданных [math]x, y[/math] и [math]a[/math] с вероятностью лишь [math] \frac{1}{m} [/math] найдётся [math]i[/math], обращающий первое равенство в тождество; аналогично и со вторым равенством.

Остаётся подытожить наши выкладки.

[math]P( [x = (ak+b)\bmod p \bmod m][/math] [math]\wedge[/math] [math][y = (al+b)\bmod p \bmod m])[/math] [math]=[/math]

[math]=[/math] [math]P( [a \equiv (k - l)^{-1}(x - y - im)[/math] [math]\pmod p][/math] [math]\wedge[/math] [math][b \equiv (l - k)^{-1}(lx - ky - jm)[/math] [math]\pmod p])[/math] [math]=[/math]

[math]=[/math] [math]P( a \equiv (k - l)^{-1}(x - y - im)[/math] [math]\pmod p)[/math] [math]\cdot[/math] [math]P( b \equiv (l - k)^{-1}(lx - ky - jm)[/math] [math]\pmod p)[/math] [math]=[/math]

[math]=[/math] [math](\frac{1}{m} + o(\frac{1}{m})) \cdot (\frac{1}{m} + o(\frac{1}{m})) = \frac{1}{m^2} + o(\frac{1}{m^2})[/math]

Переход к третьей строчке объясняется тем, что события, объединённые знаком [math]\wedge[/math], независимы (т.к. случайные величины здесь только [math]a[/math] и [math]b[/math]; [math]x, y, k, l[/math] — фиксированы).
[math]\triangleleft[/math]

Источники информации

  • Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2005. — с. 294. — ISBN 5-8459-0857-4