<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://digida.mgpu.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5</id>
	<title>Универсальное хеширование - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://digida.mgpu.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5"/>
	<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;action=history"/>
	<updated>2026-05-06T15:20:57Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=4663&amp;oldid=prev</id>
		<title>Patarakin: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=4663&amp;oldid=prev"/>
		<updated>2022-10-19T17:55:02Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 20:55, 19 октября 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Patarakin</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=4662&amp;oldid=prev</id>
		<title>ru_wikipedia&gt;InternetArchiveBot: Спасено источников — 2, отмечено мёртвыми — 0. Сообщить об ошибке. См. FAQ.) #IABot (v2.0.9</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=4662&amp;oldid=prev"/>
		<updated>2022-08-19T13:47:31Z</updated>

		<summary type="html">&lt;p&gt;Спасено источников — 2, отмечено мёртвыми — 0. &lt;a href=&quot;/index.php?title=En:User_talk:InternetArchiveBot&amp;amp;action=formedit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;En:User talk:InternetArchiveBot (страница не существует)&quot;&gt;Сообщить об ошибке&lt;/a&gt;. См. &lt;a href=&quot;/index.php?title=M:InternetArchiveBot/FAQ/ru&amp;amp;action=formedit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;M:InternetArchiveBot/FAQ/ru (страница не существует)&quot;&gt;FAQ&lt;/a&gt;.) #IABot (v2.0.9&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Универса́льное хеши́рование&amp;#039;&amp;#039;&amp;#039; ({{lang-en|Universal hashing}}) — это вид [[хеширование|хеширования]], при котором используется не одна конкретная хеш-функция, а происходит выбор из заданного семейства по случайному [[алгоритм]]у&amp;lt;ref name=CW79&amp;gt;&lt;br /&gt;
{{статья&lt;br /&gt;
|заглавие=Universal Classes of Hash Functions&lt;br /&gt;
|издание={{Нп3|Journal of Computer and System Sciences}}&lt;br /&gt;
|том=18&lt;br /&gt;
|номер=2&lt;br /&gt;
|страницы=143—154&lt;br /&gt;
|doi=10.1016/0022-0000(79)90044-8&lt;br /&gt;
|id=Conference version in STOC&amp;#039;77&lt;br /&gt;
|язык=en&lt;br /&gt;
|автор=Carter, Larry; {{Нп3|Wegman, Mark N.|Wegman, Mark N.||Mark N. Wegman}}&lt;br /&gt;
|год=1979&lt;br /&gt;
|тип=journal}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=Mikkel&amp;gt;Thorup, Mikkel, [http://www.diku.dk/summer-school-2014/course-material/mikkel-thorup/hash.pdf_copy|High Speed Hashing for Integers and Strings]{{Недоступная ссылка|date=Июнь 2019 |bot=InternetArchiveBot }}, Cornell University Library, July 15, 2014&amp;lt;/ref&amp;gt;. Такой подход обеспечивает равномерное хеширование: для очередного ключа вероятности помещения его в любую ячейку совпадают. Известно несколько семейств универсальных хеш-функций, которые имеют многочисленные применения в [[Информатика|информатике]], в частности в [[Хеш-таблица|хеш-таблицах]], [[Вероятностный алгоритм|вероятностных алгоритмах]] и [[Криптография|криптографии]].&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
{{Смотрите также|Хеширование}}&lt;br /&gt;
&lt;br /&gt;
Впервые понятие универсального хеширования было введено в статье&amp;lt;ref name=CW79/&amp;gt; [[Картер, Ларри|Картера]] и {{нп4|Вегман, Марк|Вегмана|en|Mark N. Wegman}} в 1979 году.&lt;br /&gt;
&lt;br /&gt;
Изначально универсальное хеширование было разработано как независящий от входных данных алгоритм, работающий в среднем за линейное время и предназначенный для хранения и извлечения ключей из хеш-таблицы. Под независимостью от входных данных подразумевается следующее: для любой [[последовательность|последовательности]] входных данных соответствующие хеш-значения элементов последовательности будут [[Дискретное равномерное распределение|равномерно распределены]] по хеш-таблице. При выполнении этого условия среднее время работы алгоритма для любых данных оказывается сравнимым со временем работы хеш-функции, используемой для распределения заранее известных данных&amp;lt;ref name=CW79/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Созданный алгоритм универсального хеширования представлял собой случайный выбор хеш-функции из некоторого набора хеш-функций(называемого универсальным семейством хеш-функций), обладающих определёнными свойствами. Авторами было показано, что в случае универсального хеширования число обращений к хеш-таблице (в среднем по всем функциям из семейства) для произвольных входных данных оказывается очень близким теоретическому минимуму для случая фиксированной хеш-функции со случайно распределёнными входными данными&amp;lt;ref name=CW79/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Используя универсальное хеширование, авторы хотели&amp;lt;ref name=CW79/&amp;gt;:&lt;br /&gt;
# Избавиться от необходимости предполагать вид входных данных.&lt;br /&gt;
# Устранить зависимость времени работы хеширования от вида входных данных.&lt;br /&gt;
# Добиться уменьшения числа [[Коллизия хеш-функции|коллизий]].&lt;br /&gt;
&lt;br /&gt;
В работе&amp;lt;ref name=CW79/&amp;gt; Вегмана и Картера универсальное хеширование было применено для построения хеш-таблицы, хотя позднее универсальное хеширование получило применение и в других областях(см. [[#Применение]]).&lt;br /&gt;
&lt;br /&gt;
== Определение универсального семейства хеш-функций ==&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; — [[множество]] ключей, &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; — конечное множество хеш-функций, отображающих &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; во множество &amp;lt;math&amp;gt;\left \{ 0,1,..,m-1 \right \}&amp;lt;/math&amp;gt;. Возьмем произвольные &amp;lt;math&amp;gt;h \in H&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x,y \in U&amp;lt;/math&amp;gt; и определим функцию коллизий &amp;lt;math&amp;gt;\delta _h (x,y)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\delta _h (x,y) = \begin{cases}&lt;br /&gt;
  1,  &amp;amp; \mbox{if }  x \ne y \mbox{ and } h(x) = h(y)\\&lt;br /&gt;
  0, &amp;amp; \mbox{otherwise}&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\delta _h (x,y) = 1&amp;lt;/math&amp;gt;, то говорят, что имеет место &amp;#039;&amp;#039;коллизия&amp;#039;&amp;#039;. Можно определить функцию коллизии не для отдельных элементов &amp;lt;math&amp;gt;x,y,h&amp;lt;/math&amp;gt;, а для целого множества элементов — для этого надо произвести [[сложение]] функций коллизий по всем элементам из множества. Например, если &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; — множество хеш-функций, &amp;lt;math&amp;gt;x \in U&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S \subset U&amp;lt;/math&amp;gt;, то для функции коллизии &amp;lt;math&amp;gt;\delta _H (x,S)&amp;lt;/math&amp;gt; получим:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\delta _H (x,S) = \sum_{h \in H} \sum_{y \in S} \delta _h (x,y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Причём порядок суммирования не имеет значения.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Определение.&amp;#039;&amp;#039;&amp;#039; Семейство хеш-функций &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; называется &amp;#039;&amp;#039;&amp;#039;универсальным&amp;#039;&amp;#039;&amp;#039;&amp;lt;ref name=CW79/&amp;gt;, если&lt;br /&gt;
: &amp;lt;math&amp;gt; \forall x, y \in U \longrightarrow \delta _H (x,S) = \frac{\left | H \right |}{m}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно дать другое определение, эквивалентное данному.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Определение&amp;#039;&amp;#039;&amp;#039;. Семейство хеш-функций &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; называется универсальным&amp;lt;ref&amp;gt;&lt;br /&gt;
{{книга&lt;br /&gt;
|заглавие=Randomized Algorithms&lt;br /&gt;
|издательство=[[Издательство Кембриджского университета|Cambridge University Press]]&lt;br /&gt;
|год=1995&lt;br /&gt;
|isbn=0-521-47465-5&lt;br /&gt;
|страницы=216—217&lt;br /&gt;
|язык=und&lt;br /&gt;
|автор=Motwani, Rajeev; Raghavan, Prabhakar&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/ref&amp;gt;{{sfn|Cormen|2001|pp=234—235}}, если&lt;br /&gt;
: &amp;lt;math&amp;gt;\forall x, y \in U, ~ x\ne y: ~~ \Pr_{h\in H} [h(x) = h(y)] \le \frac{1}{m}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства универсального семейства хеш-функций в случае его применения к хеш-таблицам ==&lt;br /&gt;
Следующая [[теорема]] определяет нижнюю границу функции &amp;lt;math&amp;gt;\delta _h (x,y)&amp;lt;/math&amp;gt; для произвольного семейства хеш-функций&amp;lt;ref name=CW79/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Теорема 1.&amp;#039;&amp;#039;&amp;#039;Для любого семейства(не обязательно универсального) хеш-функций &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; существуют &amp;lt;math&amp;gt;x,y \in U&amp;lt;/math&amp;gt; такие, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\delta _H (x,S) &amp;gt; \frac{\left | H \right |}{m} - \frac{\left | H \right |}{\left | U \right |}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из теоремы 1 следует, что нижняя граница функции коллизии близка к &amp;lt;math&amp;gt;\frac{\left | H \right |}{m}&amp;lt;/math&amp;gt; в случае, когда &amp;lt;math&amp;gt;\left | U \right | &amp;lt;/math&amp;gt; много больше &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. В действительности, часто так и бывает. Например, пусть [[компилятор]] ставит в соответствие тысяче [[Переменная (программирование)|переменных]] последовательности из семи английских букв. Тогда &amp;lt;math&amp;gt;m = 1000&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\left | U \right | = 26^7&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для универсального семейства хеш-функций это означает, что верхняя и нижняя границы функции коллизии довольно близки&amp;lt;ref name=CW79/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В статье&amp;lt;ref name=CW79/&amp;gt; универсальное хеширование применялось для организации [[Хеш-таблица#Разрешение коллизий|хеш-таблиц с разрешением коллизий методом цепоче]]к. Ниже изложены теоремы, дающие некоторые оценки значений функции коллизии и производительности хеширования в случае организации хеш-таблицы с разрешением коллизий методом цепочек.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; — универсальное семейство хеш-функций, отображающих множество ключей &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; во множество &amp;lt;math&amp;gt;\left \{ 0,1,..,m-1 \right \}&amp;lt;/math&amp;gt;. Пусть для организации хеш-таблицы с разрешением коллизий методом цепочек, то есть с помощью [[линейный список|линейного списка]], используется некоторая случайная функция &amp;lt;math&amp;gt;h \in H&amp;lt;/math&amp;gt;. Если хеш-функция &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; отобразила в таблицу подмножество &amp;lt;math&amp;gt;S \subset U&amp;lt;/math&amp;gt; ключей, то средняя длина связанных списков будет равна &amp;lt;math&amp;gt;1 + \delta _h (x,S)&amp;lt;/math&amp;gt;. Следующая теорема дает оценку для функции коллизий в случае универсального семейства.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Теорема 2.&amp;#039;&amp;#039;&amp;#039;&amp;lt;ref name=CW79/&amp;gt; Пусть &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; — произвольный элемент множества &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — произвольное подмножество множества &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;. Пусть функция &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; случайно выбирается из универсального семейства хеш-функций &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;. Тогда имеет место следующая оценка:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\delta _h (x,S) \leqslant \frac{\left | S \right |}{m} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Этот результат можно использовать для вычисления ожидаемой производительности хеш-функции для последовательности из &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; запросов. Но сначала надо уточнить, что подразумевается под производительностью. Для этого нужно определить понятие стоимости — под стоимостью одного запроса к хеш-таблице по ключу &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; понимается число &amp;lt;math&amp;gt;1 + \delta _h (x,S) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — множество ранее помещённых в таблицу ключей, а в самой хеш-таблице используется метод цепочек(то есть это число операций, необходимое для выполнения одного запроса). Стоимость &amp;lt;math&amp;gt;C(h,R)&amp;lt;/math&amp;gt; хеш-функции &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; на последовательности запросов &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; есть сумма стоимостей отдельных запросов, идущих в последовательности, указанной в &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;. Стоимость, по сути, представляет количественную меру производительности.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Теорема 3.&amp;#039;&amp;#039;&amp;#039;&amp;lt;ref name=CW79/&amp;gt; Пусть &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; Пусть &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; — это последовательность из &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; запросов, содержащая &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вставок. Пусть &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; — универсальное семейство хеш-функций. Тогда для случайно выбранной из &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; хеш-функции &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; справедливо [[неравенство]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;M[C(h,R)] \leqslant r(1+\frac{k}{m})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Довольно часто&amp;lt;ref name=CW79/&amp;gt; известно приближенное число ключей, которое необходимо хранить в хеш-таблице. Тогда, можно подобрать размер &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; хеш-таблицы таким образом, чтобы отношение &amp;lt;math&amp;gt;\frac{k}{m}&amp;lt;/math&amp;gt; было приблизительно равно 1. Значит, согласно теореме 3, ожидаемая стоимость исполнения последовательности запросов &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; будет [[Пропорциональность#Прямо пропорциональные величины|прямо пропорционально]] числу запросов &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. Причём это справедливо для любой последовательности запросов &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, а не для некоторой «средней» последовательности.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для любой случайно выбранной из универсального семейства хеш-функции её производительность оказывается достаточно хорошей. Остаётся вопрос о том, нужно ли менять хеш-функцию с течением времени, а если нужно, то как часто.&lt;br /&gt;
&lt;br /&gt;
В случае с хеш-таблицами частая смена хеш-функций ведёт к большим накладным расходам. Например, если хеш-таблица имеет очень большие размеры, то при смене хеш-функции потребуется перемещение большого объёма данных. Существует несколько стратегий выбора хеш-функции. Наиболее простая стратегия состоит в том, чтобы в начале работы случайно выбрать хеш-функцию &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; и не менять её вплоть до конца работы. Однако в этом случае производительность хеш-функции оказывается значительно ниже ожидаемой&amp;lt;ref name=CW79/&amp;gt;. Другая стратегия состоит в том, чтобы время от времени подсчитывать число коллизий и менять хеш-функцию, если это число значительно превышает ожидаемое. Такой подход обеспечивает хорошую производительность, при условии, что хеш-функция выбирается случайно.&lt;br /&gt;
&lt;br /&gt;
== Построение универсального семейства хеш-функций ==&lt;br /&gt;
Этот раздел посвящён построению универсальных семейств хеш-функций, из которых случайным образом выбирается хеш-функция.&lt;br /&gt;
&lt;br /&gt;
Существует несколько семей универсальных хеш-функций, которые различаются тем, для каких данных предназначены эти функции: [[скаляр]]ы (хеширование чисел), [[вектор (математика)|векторы]] фиксированной длины (хеширование векторов), векторы переменной длины (хеширование строк).&lt;br /&gt;
&lt;br /&gt;
=== Хеширование чисел ===&lt;br /&gt;
Выберем [[простое число]] &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; и рассмотрим [[Конечное поле|поле]] &amp;lt;math&amp;gt;\mathbb {Z}_p = \left \{ 0,1, ...,p-1 \right \}&amp;lt;/math&amp;gt; и его мультипликативную группу &amp;lt;math&amp;gt;\mathbb {Z} _p^* = \left \{ 1,..,p-1 \right \}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Теорема.&amp;#039;&amp;#039;&amp;#039; Множество [[функция (математика)|функций]] вида &amp;lt;math&amp;gt;H_{p,m} = \left \{ h_{a,b}: a \in \mathbb {Z} _p^*,b \in \mathbb {Z} _p \right \}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;h_{a,b}(x) = ((ax+b) \mod p) \mod m&amp;lt;/math&amp;gt;, является универсальным (Это было показано в работе Картера и Вегмана&amp;lt;ref name=CW79 /&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Действительно, &amp;lt;math&amp;gt;h(x) = h(y)&amp;lt;/math&amp;gt; только при&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;ax+b \equiv ay + b + i\cdot m \pmod{p}, \; \forall i \in  \left \{ 0,1, ..., p/m  \right \}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt; x \neq y &amp;lt;/math&amp;gt;, то [[вычитание|разность]] &amp;lt;math&amp;gt;x-y \neq 0&amp;lt;/math&amp;gt; и может быть обращена [[деление с остатком|по модулю]] &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. Отсюда можно получить&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;a \equiv i\cdot m \cdot (x-y)^{-1} \pmod{p}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это [[уравнение]] имеет &amp;lt;math&amp;gt;p-1&amp;lt;/math&amp;gt; решений, причем правая часть может принимать &amp;lt;math&amp;gt;\lfloor p/m \rfloor&amp;lt;/math&amp;gt; значений. Таким образом, вероятность коллизий равна&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\lfloor p/m \rfloor / (p-1)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
которая стремится к &amp;lt;math&amp;gt;1/m&amp;lt;/math&amp;gt; при увеличении &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;\Box&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Хеширование векторов ===&lt;br /&gt;
Пусть число &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; является простым. Пусть входные данные &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; представлены как последовательность &amp;lt;math&amp;gt;r+1&amp;lt;/math&amp;gt; элементов, принадлежащих &amp;lt;math&amp;gt;\left \{ 0,1,..,p-1 \right \}&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;x = \left \langle x_0, x_1, ..., x_r \right \rangle&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для всех последовательностей вида &amp;lt;math&amp;gt;a = \left \langle a_0, a_1, ..., a_r \right \rangle, a_i \in \mathbb {Z}_p, i = \overline{0,r}&amp;lt;/math&amp;gt; рассмотрим функцию &amp;lt;math&amp;gt;h_a&amp;lt;/math&amp;gt; вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;h_a(x) =\sum^{r}_{i=0} {a_ix_i} \mod m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Положим, что &amp;lt;math&amp;gt;H = \bigcup_a h_a&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Видно, что &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; содержит &amp;lt;math&amp;gt;m^{r+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Теорема.&amp;#039;&amp;#039;&amp;#039; Множество &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; является универсальным семейством хеш-функций (Это также было показано Картером и Вегманом&amp;lt;ref name=CW79 /&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Действительно, если &amp;lt;math&amp;gt;x = \left \langle x_0, x_1, ..., x_r \right \rangle, y = \left \langle y_0, y_1, ..., y_r \right \rangle&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;x_0 \neq y_0&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;h_a(x) = h_a(y)&amp;lt;/math&amp;gt; тогда и только тогда, когда&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;a_0(x_0 - y_0) = - \sum^{r}_{i=1} {a_i(x_i - y_i)} \mod m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку &amp;lt;math&amp;gt;x_0 - y_0 \not\equiv 0 \mod m &amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\forall \left \langle a_1, ..., a_r \right \rangle, \exists ! a_0 &amp;lt;/math&amp;gt; при котором выполняется указанное уравнение. Количество таких последовательностей равно &amp;lt;math&amp;gt;m^r&amp;lt;/math&amp;gt;, а значит и количество функций из &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;, не различающих &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; также равно &amp;lt;math&amp;gt;m^r&amp;lt;/math&amp;gt;. Но &amp;lt;math&amp;gt;m^r = \frac{\left | H \right |}{m}&amp;lt;/math&amp;gt;, откуда и следует универсальность. &amp;lt;math&amp;gt;\Box&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это семейство функций можно обобщить&amp;lt;ref name=thorup09&amp;gt;&lt;br /&gt;
{{cite conference&lt;br /&gt;
   | last = Thorup | first = Mikkel&lt;br /&gt;
   | title = String hashing for linear probing&lt;br /&gt;
   | work = Proc. 20th ACM-SIAM Symposium on Discrete Algorithms (SODA)&lt;br /&gt;
   | pages = Proc. 20th ACM-SIAM Symposium on Discrete Algorithms (SODA), 655–664&lt;br /&gt;
   | year = 2009&lt;br /&gt;
   | archive-url = https://web.archive.org/web/20131012004656/http://www.siam.org/proceedings/soda/2009/SODA09_072_thorupm.pdf&lt;br /&gt;
   | archive-date = 2013-10-12&lt;br /&gt;
   | dead-url = no&lt;br /&gt;
   | doi = 10.1137/1.9781611973068.72&lt;br /&gt;
   | url = http://epubs.siam.org/doi/pdf/10.1137/1.9781611973068.72&lt;br /&gt;
}}, section 5.3&lt;br /&gt;
&amp;lt;/ref&amp;gt;. Рассмотрим семейство функций &amp;lt;math&amp;gt;H_{p,m} = \left \{ h_{a,b}: a \in \mathbb {Z} _p^*,b \in \mathbb {Z} _p \right \}&amp;lt;/math&amp;gt; и для вектора &amp;lt;math&amp;gt;x = \left \langle x_0, x_1, ..., x_r \right \rangle&amp;lt;/math&amp;gt; рассмотрим хеш-функцию&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;h(\bar{x}) = \left( \sum_{i=0}^{k-1} h_i(x_i) \right)\,\bmod~m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;h_i \in H&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда совокупность таких функций также будет являться универсальным семейством.&lt;br /&gt;
&lt;br /&gt;
=== Хеширование строк ===&lt;br /&gt;
В этом случае входными данными для хеш-функции являются вектора, длина которых не является фиксированной величиной. Если можно ограничить длину всех векторов некоторым числом &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;, то можно применить подход, который был использован для векторов фиксированной длины. При этом, если длина вектора &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; меньше &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;, то можно дополнить вектор нулями так, чтобы его длина стала равна &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&amp;lt;ref name=thorup09/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь предположим, что нельзя заранее подобрать число &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;, ограничивающее длину всех векторов. Тогда можно предложить такой подход&amp;lt;ref name=DGMP&amp;gt;Dietzfelbinger, Martin; Gil, Joseph; Matias, Yossi; Pippenger, Nicholas(1992). «Polynomial Hash Functions Are Reliable (Extended Abstract)». Proc. 19th International Colloquium on Automata, Languages and Programming (ICALP). pp. 235—246&lt;br /&gt;
&amp;lt;/ref&amp;gt; : пусть имеется входной вектор &amp;lt;math&amp;gt;\bar{x} = (x_0,\dots, x_\ell), \forall x_i \in \left \{ 0, 1, ..., u-1 \right \}&amp;lt;/math&amp;gt;. Положим, что &amp;lt;math&amp;gt;p \ge \max \{ u, m \}&amp;lt;/math&amp;gt; и будем рассматривать компоненты вектора как коэффициенты [[многочлен]]а: &amp;lt;math&amp;gt;x_l \cdot a^l + x_{l-1} \cdot a^{l-1} + ... x_{1} \cdot a^{1} + x_{0} \cdot a^{0},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;a \in \left \{ 0, 1, ..., p-1 \right \}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда для векторов переменной длины универсальная хеш-функция может быть определена следующим образом:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;h_a(\bar{x}) = h_{a}^\mathrm{int} \left( \big(\sum_{i=0}^\ell x_i\cdot  a^i \big) \bmod ~p \right),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
: &amp;lt;math&amp;gt;h_{a}^\mathrm{int}:\left \{ 0,1,..,p-1 \right \} \rightarrow\left \{ 0,1,..,m-1 \right \}&amp;lt;/math&amp;gt;&lt;br /&gt;
является универсальной хеш-функцией для числовых аргументов.&lt;br /&gt;
&lt;br /&gt;
== Применение ==&lt;br /&gt;
Коды аутентификации сообщений [[UMAC]], {{нп4|Poly1305-AES|Poly1305-AES|en|Poly1305-AES}} и некоторые другие основаны на использовании универсального хеширования&amp;lt;ref&amp;gt;* David Wagner, ed. [https://books.google.com/books?id=11BsCQAAQBAJ «Advances in Cryptology — CRYPTO 2008»] {{Wayback|url=https://books.google.com/books?id=11BsCQAAQBAJ |date=20160529122039 }}. p. 145.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;* Jean-Philippe Aumasson, Willi Meier, Raphael Phan, Luca Henzen. [https://books.google.com/books?id=nhPmBQAAQBAJ «The Hash Function BLAKE»] {{Wayback|url=https://books.google.com/books?id=nhPmBQAAQBAJ |date=20160506004255 }}. 2014. p. 10.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;* M. Wegman and L. Carter, «New hash functions and their use in authentication and set equality», Journal of Computer and System Sciences, 22 (1981), pp. 265—279.&amp;lt;/ref&amp;gt;. В этих кодах для каждого сообщения выбирается своя хеш-функция в зависимости от его одноразового уникального номера.&lt;br /&gt;
&lt;br /&gt;
Универсальное семейство хеш-функций может быть использовано в том случае, когда требуется наличие большого числа «хороших» хеш-функций. [[Программист]]ы часто тратят много времени, проводя [[анализ (раздел математики)|анализ]] работы хеш-функций на различных данных и пытаясь выбрать подходящую{{sfn|Кнут|2007|страницы=508—513}}. Время поиска можно уменьшить, взяв универсальное семейство хеш-функций и выбрав случайно несколько функций из этого семейства&amp;lt;ref name=CW79/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теоретическая значимость универсального хеширования состоит в том, что оно даёт «хорошую» границу для средней производительности алгоритмов, использующих хеширование. Например, универсальное хеширование было применено в алгоритмах, представленных в работах&lt;br /&gt;
&amp;lt;ref&amp;gt;M.0.RABIN,Probabilistic algorithms, in «Proceedings of Symposium on New Directions and Recent Results in Algorithms and Complexity» (J.F.Traub,Ed.), pp.21-39,Academic Press, New York, 1976.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;.GOTO AND Y.KANADA,Hashing lemmas on time complexities with applications to formula manipulation, in &amp;quot;Proceedings of the 1976 ACM Symposium on Symbolic and Algebraic Computation, &amp;quot; Yorktown Heights, N.Y.,pp.149—153.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;.GUSTAVSON AND D.Y.Y. YUN, Arithmetic complexity of unordered or sparse polynomials, in &amp;quot;Proceedings of the 1976 ACM Symposium on Symbolic and Algebraic Computation, &amp;quot; Yorktown Heights, N.Y.,pp.154—159.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В теоретической криптографии было показано, что с помощью универсальных хеш-функций можно построить систему [[аутентификация|аутентификации]] с предельно достижимой секретностью&amp;lt;ref name=CW79/&amp;gt;. Примером универсальной хеш-функцией с доказанной [[криптографическая стойкость|криптографической стойкостью]] является хеш-функция [[SWIFFT]].&lt;br /&gt;
&lt;br /&gt;
Более того, одним из наиболее важных приложений универсального хеширования является скоординированная выборка&amp;lt;ref name=Mikkel/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Имитовставка|MAC]]&lt;br /&gt;
* [[UMAC]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания|2}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга&lt;br /&gt;
 |автор         = Cormen T. H., Leiserson C. E., Rivest R. L., Stein C.&lt;br /&gt;
 |заглавие      = Алгоритмы: построение и анализ&lt;br /&gt;
 |оригинал      = Introduction to algorithms&lt;br /&gt;
 |ссылка        = https://books.google.ru/books?id=NLngYyWFl_YC&lt;br /&gt;
 |издание       = 2-е изд&lt;br /&gt;
 |место         = USA&lt;br /&gt;
 |издательство  = MIT Press&lt;br /&gt;
 |год           = 2001&lt;br /&gt;
 |страницы      = 234—237&lt;br /&gt;
 |страниц       = 1180&lt;br /&gt;
 |isbn          = 9780262032933&lt;br /&gt;
 |ref           = Cormen&lt;br /&gt;
}}&lt;br /&gt;
* {{книга|подзаголовок|заглавие=Искусство программирования, том 3. Сортировка и поиск|оригинал=The Art of Computer Programming, vol.3. Sorting and Searching|ссылка=|автор=[[Дональд Кнут]]|издание=2-е изд|год=2007|место={{М.}}|издательство=[[Вильямс (издательство)|Вильямс]]|страницы=508—513, 557|страниц=824|isbn=0-201-89685-0|ref=Кнут}}&lt;br /&gt;
* {{книга&lt;br /&gt;
 |автор         = Michael Luby&lt;br /&gt;
 |заглавие      = Pseudorandomness and Cryptographic Applications&lt;br /&gt;
 |место         = USA&lt;br /&gt;
 |издательство  = Princeton University Press&lt;br /&gt;
 |год           = 1996&lt;br /&gt;
 |страницы      = 153—163&lt;br /&gt;
 |страниц       = 248&lt;br /&gt;
 |isbn          = 0691025460&lt;br /&gt;
 |ref           = MLuby&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%81%D0%B5%D0%BC%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%BE_%D1%85%D0%B5%D1%88-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9 Универсальное хеширование]&lt;br /&gt;
* [http://geo.web.ru/db/msg.html?mid=1161287&amp;amp;uri=node66.html Универсальные семейства хеш-функций]&lt;br /&gt;
{{Внешние ссылки}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Теория сложности вычислений]]&lt;br /&gt;
[[Категория:Криптографические хеш-функции]]&lt;br /&gt;
[[Категория:Хеширование]]&lt;br /&gt;
[[Категория:Алгоритмы поиска]]&lt;/div&gt;</summary>
		<author><name>ru_wikipedia&gt;InternetArchiveBot</name></author>
	</entry>
</feed>