В информатике семейство хэш-функций называется k -независимым , k -независимым или k -универсальным [1], если выбор функции случайным образом из семейства гарантирует, что хэш-коды любых обозначенных k ключей являются независимыми случайными величинами (см. точные математические определения ниже). Такие семейства обеспечивают хорошую производительность в среднем случае в рандомизированных алгоритмах или структурах данных, даже если входные данные выбираются противником. Компромиссы между степенью независимости и эффективностью оценки хэш-функции хорошо изучены, и было предложено много k -независимых семейств.
Целью хеширования обычно является отображение ключей из некоторого большого домена (вселенной) в меньший диапазон, такой как ячейки (помеченные ). При анализе рандомизированных алгоритмов и структур данных часто желательно, чтобы хеш-коды различных ключей «вели себя случайным образом». Например, если бы хеш-код каждого ключа был независимым случайным выбором в , количество ключей на ячейку можно было бы проанализировать с помощью границы Чернова . Детерминированная хеш-функция не может дать никакой такой гарантии в состязательной обстановке, поскольку противник может выбрать ключи так, чтобы они были точным прообразом ячейки. Кроме того, детерминированная хеш-функция не допускает повторного хеширования : иногда входные данные оказываются плохими для хеш-функции (например, слишком много коллизий), поэтому хотелось бы изменить хеш-функцию.
Решение этих проблем заключается в том, чтобы выбрать функцию случайным образом из большого семейства хэш-функций. Случайность в выборе хэш-функции может быть использована для гарантии некоторого желаемого случайного поведения хэш-кодов любых интересующих ключей. Первым определением в этом направлении было универсальное хэширование , которое гарантирует низкую вероятность коллизии для любых двух назначенных ключей. Концепция -независимого хэширования, введенная Вегманом и Картером в 1981 году [2], усиливает гарантии случайного поведения для семейств назначенных ключей и добавляет гарантию равномерного распределения хэш-кодов.
Самое строгое определение, введенное Вегманом и Картером [2] под названием «сильно универсальное семейство хэшей», следующее. Семейство хэш-функций является -независимым, если для любых различных ключей и любых хэш-кодов (не обязательно различных) мы имеем:
Это определение эквивалентно следующим двум условиям:
Часто бывает неудобно достичь идеальной совместной вероятности из -за проблем округления. Следуя [3], можно определить -независимое семейство для удовлетворения:
Обратите внимание, что даже если близко к 1, больше не являются независимыми случайными величинами, что часто является проблемой при анализе рандомизированных алгоритмов. Поэтому более распространенной альтернативой решению проблем округления является доказательство того, что хэш-семейство близко по статистическому расстоянию к -независимому семейству, что позволяет использовать свойства независимости в стиле черного ящика.
Первоначальный метод построения k -независимых хэш-функций, предложенный Картером и Вегманом, состоял в выборе большого простого числа p , выборе k случайных чисел по модулю p и использовании этих чисел в качестве коэффициентов многочлена степени k − 1 , значения которого по модулю p используются в качестве значения хэш-функции. Все многочлены данной степени по модулю p одинаково вероятны, и любой многочлен однозначно определяется любым k -кортежем пар аргумент-значение с различными аргументами, из чего следует, что любой k -кортеж различных аргументов с одинаковой вероятностью будет сопоставлен любому k -кортежу значений хэш-функции. [2]
В общем случае многочлен может быть оценен в любом конечном поле . Помимо полей по модулю простого числа, популярным выбором является поле размера , которое поддерживает быструю конечную полевую арифметику на современных компьютерах. Такой подход использовали Дэниел Лемир и Оуэн Касер для CLHash. [4]
Табуляция хеширования — это метод сопоставления ключей с хэш-значениями путем разбиения каждого ключа на байты , использования каждого байта в качестве индекса в таблице случайных чисел (с другой таблицей для каждой позиции байта) и объединения результатов этих табличных поисков с помощью побитовой операции исключающего или . Таким образом, он требует большей случайности при своей инициализации, чем полиномиальный метод, но избегает возможно медленных операций умножения. Он является 3-независимым, но не 4-независимым. [5] Разновидности табуляции хеширования могут достигать более высоких степеней независимости, выполняя табличные поиски на основе перекрывающихся комбинаций битов из входного ключа или применяя простое табуляционное хеширование итеративно. [6] [7]
Понятие k -независимости можно использовать для различения различных методов разрешения коллизий в хеш-таблицах в зависимости от уровня независимости, необходимого для гарантии постоянного ожидаемого времени на операцию.
Например, хэш-цепочка занимает постоянное ожидаемое время даже с 2-независимым семейством хэш-функций, поскольку ожидаемое время для выполнения поиска заданного ключа ограничено ожидаемым числом коллизий, в которых участвует ключ. По линейности ожидания это ожидаемое число равно сумме, по всем другим ключам в хэш-таблице, вероятности того, что заданный ключ и другой ключ столкнутся. Поскольку члены этой суммы включают только вероятностные события, включающие два ключа, 2-независимости достаточно, чтобы гарантировать, что эта сумма имеет то же значение, что и для действительно случайной хэш-функции. [2]
Двойное хеширование — еще один метод хеширования, требующий низкой степени независимости. Это форма открытой адресации, которая использует две хеш-функции: одну для определения начала последовательности зонда, а другую для определения размера шага между позициями в последовательности зонда. Пока обе они являются 2-независимыми, этот метод дает постоянное ожидаемое время на операцию. [8]
С другой стороны, линейное зондирование , более простая форма открытой адресации, где размер шага всегда равен единице, может гарантированно работать за постоянное ожидаемое время на операцию с 5-независимой хеш-функцией [9] , и существуют 4-независимые хеш-функции, для которых требуется логарифмическое время на операцию. [10]
Для хеширования Cuckoo требуемая k-независимость неизвестна по состоянию на 2021 год. В 2009 году было показано [11] , что достаточно -независимости, и требуется как минимум 6-независимость . Другой подход заключается в использовании хеширования Tabulation , которое не является 6-независимым, но, как было показано в 2012 году [12] , имеет другие свойства, достаточные для хеширования Cuckoo. Третий подход с 2014 года [13] заключается в небольшой модификации хеш-таблицы cuckoo с так называемым stash, что позволяет использовать не более 2-независимых хеш-функций.
Кейн , Нельсон и Дэвид Вудрафф улучшили алгоритм Флажоле–Мартина для задачи об отдельных элементах в 2010 году. [14] Чтобы дать приближение к правильному ответу, им нужна -независимая хеш-функция.
Алгоритм Count Sketch для снижения размерности требует двух хеш-функций: одну 2-независимую и одну 4-независимую .
Алгоритм Карлоффа–Цвика для задачи MAX-3SAT может быть реализован с тремя независимыми случайными величинами.
Алгоритм MinHash может быть реализован с использованием -независимой хеш-функции, как это доказал Петр Индик в 1999 году [15]