Каким критериям должна удовлетворять хорошая хэш функция
- MD5: 16 байт (время до хэша 500 МБ: 1462 МС)
- SHA1: 20 байт (1644 МС)
- SHA256: 32 байта (5618 МС)
- SHA384: 48 байт (3839 МС)
- SHA512: 64 байта (3820 МС)
- RIPEMD: 20 байт (7066 МС)
каждая из этих функций выполняет по-разному; MD5 является самым быстрым, а RIPEMD - самый медленный.
MD5 имеет то преимущество, что он вписывается во встроенный тип Guid. Что делает его очень простым в использовании для идентификации.
MD5 однако уязвим для Таранов, SHA1 также уязвим, но в меньшей степени.
При каких условиях следует использовать какой алгоритм хеширования?
конкретные вопросы, на которые мне действительно интересно получить ответ:
нельзя ли доверять MD5? В обычных ситуациях, когда вы используете алгоритм MD5 без злого умысла, и ни одна третья сторона не имеет злого умысла, вы ожидаете каких-либо столкновений (то есть два произвольных байта [], производящих один и тот же хэш)
насколько лучше RIPEMD, чем SHA1? (если его лучше) его 5 раз медленнее вычислять, но размер хэша такой же, как SHA1.
каковы шансы получить не злонамеренные коллизии при хэшировании имен файлов (или других коротких струны)? (Напр. 2 случайные имена файлов с тем же хэшем MD5) (с MD5 / SHA1 / SHA2xx) в общем, каковы шансы на не злонамеренные столкновения?
Это тест, который я использовал:
в криптографии хэш-функции предоставляют три отдельные функции.
Это был показано, что MD5 не устойчив к столкновениям, однако, что не исключает его использования в приложениях, не требующих сопротивления столкновению. Действительно, MD5 часто все еще используется в приложениях, где меньший размер и скорость ключа полезны. Тем не менее, из-за его недостатков исследователи рекомендуют использовать другие хэш-функции в новых сценариях.
SHA1 имеет недостаток, который позволяет обнаруживать коллизии теоретически намного меньше, чем 2^80 шагов безопасной хэш-функции его длины потребовать. Атака постоянно пересматривается и в настоящее время может быть выполнена в
2^63 шага - едва ли в пределах текущей области вычисляемости. По этой причине NIST постепенно прекращает использование SHA1, заявив, что семейство SHA2 должно использоваться после 2010 года.
SHA2-это новое семейство хэш-функций, созданных после SHA1. В настоящее время нет известных атак на функции SHA2. SHA256, 384 и 512 все часть семьи SHA2, как раз используя различные ключевые длины.
RIPEMD я не могу комментировать слишком много, за исключением того, что он не так часто используется, как семьи SHA, и поэтому не был тщательно изучен криптографическими исследователями. Только по этой причине я бы рекомендовал использовать функции SHA над ним. В реализации, которую вы используете, он также кажется довольно медленным, что делает его менее полезным.
В заключение, нет одной лучшей функции - все зависит от того, для чего она вам нужна. Помните о недостатках с каждым и вы сможете лучше всего выбрать правильную хэш-функцию для код сценарий.
Все хэш-функции "сломаны"
на принципу Дирихле говорит, что старайтесь изо всех сил, вы не можете поместиться больше, чем 2 голубей в 2 отверстия (если вы не режете голубей). Точно так же вы не можете поместить 2^128 + 1 номера в 2^128 слотов. Все хэш-функции приводят к хэшу конечного размера, это означает, что вы всегда можете найти столкновение, если вы ищете последовательности "конечного размера" + 1. Это просто невозможно сделать. Не MD5 и не Лялька.
MD5 / SHA1/Sha2xx не имеют случайных столкновений
все хэш-функции имеют коллизии, это факт жизни. Попадание на эти столкновения случайно эквивалентно победу в межгалактической лотерее. То есть, никто не выигрывает в межгалактической лотерее, Ее просто не так, как работает лотерея. Вы никогда не столкнетесь с случайным хэшем MD5/SHA1/SHA2XXX. Каждое слово в каждом словаре, в каждом язык, хэши к другому значению. Каждое имя пути на каждой машине на всей планете имеет другой хэш MD5/SHA1/SHA2XXX. Откуда мне знать, спросите вы. Как я уже говорил, никто никогда не выигрывает в межгалактической лотерее.
Но. MD5-это сломанный
иногда тот факт, что его сломали не важно.
тем не менее, Текущая рекомендация RSA не использовать MD5, если вам нужно сопротивление предварительного изображения. Люди склонны ошибаться в сторону осторожности, когда дело доходит до алгоритмов безопасности.
- используйте MD5, если вам нужна скорость / размер и не заботитесь о нападениях на день рождения или атаках до изображения.
повтори это за мной,нет никаких шансов столкновения MD5, вредоносные столкновения могут быть тщательно спроектированы. Несмотря на то, что на сегодняшний день на MD5 нет известных атак до изображения, линия от экспертов по безопасности заключается в том, что MD5 не следует использовать там, где вам нужно защищаться от атак до изображения. тоже касается В SHA1.
имейте в виду, что не все алгоритмы должны защищаться от атак предварительного изображения или столкновения. Возьмите тривиальный случай первого поиска дубликатов файлов на вашем HD.
- используйте функцию на основе SHA2XX, если вы хотите криптографически безопасную хэш-функцию.
никто никогда не находил столкновения SHA512. КОГДА-ЛИБО. Они очень старались. Если на то пошло, никто никогда не находил столкновения SHA256 или 384. .
- не используйте SHA1 или RIPEMD, если это не для сценария совместимости.
SHA1 атаки столкновения до 2^52, его не будет слишком долго, пока Столкновения SHA1 происходят в дикой природе.
для получения актуальной информации о различных хэш-функциях посмотрите на хэш-функция zoo.
Но подождите, есть больше
имеющего быстро хэш-функция может быть проклятием. Например: очень распространенным использованием хэш-функций является хранение паролей. По сути, вы вычисляете хэш пароля в сочетании с известной случайной строкой (чтобы препятствовать атакам rainbow) и сохраняете этот хэш в база данных.
проблема в том, что если злоумышленник получает дамп базы данных, он может довольно эффективно взлома паролей с помощью грубой силы. Каждая комбинация, которую он пробует, занимает лишь долю миллисекунды, и он может опробовать сотни тысяч паролей в секунду.
Хэш-код создается функцией Н :
- Хэш-функция Н должна применяться к блоку данных любой длины.
- Хэш-функция Н должна создавать выход фиксированной длины.
- Н(М) относительно легко (за полиномиальное время) вычисляется для любого значения М .
- Для любого данного значения хэш-кода h вычислительно невозможно найти M такое, что Н(M)=h .
- Для любого данного М вычислительно невозможно найти М′ ≠ M такое, что H(M)=H(M′) .
- Вычислительно невозможно найти произвольную пару (M,M′) такую, что H(M)=H(M′) .
Хэш-функция, которая удовлетворяет первым пяти свойствам, называется простой или слабой хэш-функцией. Если кроме того выполняется шестое свойство, то такая функция называется сильной хэш-функцией. Шестое свойство защищает против класса атак, известных как атака "день рождения".
"Парадокс дня рождения"
Так называемый "парадокс дня рождения" состоит в следующем.
Первая задача. Каким должно быть число k , чтобы для данного значения X и значений Y1, …, Yk , каждое из которых принимает значения от 1 до n, вероятность того, что хотя бы для одного Yi выполнялось равенство X=Y
Для одного значения Y вероятность того, что X=Y , равна 1/n .
Соответственно, вероятность того, что X ≠ Y , равна 1 – 1/n .
Если создать k значений, то вероятность того, что ни для одного из них не будет совпадений, равна произведению вероятностей, соответствующих одному значению, т.е. (1 – 1/n) k .
Следовательно, вероятность по крайней мере одного совпадения равна
P (X = Yi) = 1 – (1 – 1/n) k
По формуле бинома Ньютона
Теперь рассмотрим вторую задачу. Обозначим P(n,k) вероятность того, что в множестве из k элементов, каждый из которых может принимать n значений, есть хотя бы два с одинаковыми значениями. Чему должно быть равно k , чтобы P(n,k) была бы больше 0,5 ?
Число различных способов выбора элементов таким образом, чтобы при этом не было дублей, равно
Всего возможных способов выбора элементов равно
Вероятность того, что дублей нет, равна
Вероятность того, что есть дубли, соответственно равна
Известно, что Если хэш-код имеет длину m бит, т.е. принимает 2 m значений, то
Подобный результат называется "парадоксом дня рождения", потому что в соответствии с приведенными выше рассуждениями для того, чтобы вероятность совпадения дней рождения у двух человек была больше 0,5, в группе должно быть всего 23 человека. Этот результат кажется удивительным, возможно, потому, что для каждого отдельного человека вероятность того, что с его днем рождения совпадет день рождения у кого-то другого в группе, достаточно мала.
Тем не менее, возможны различного рода атаки, основанные на "парадоксе дня рождения". Возможна следующая стратегия:
Вследствие этого длина хэш-кода должна быть достаточно большой. Длина, равная 64 битам, в настоящее время не считается безопасной. Пред-почтительнее, чтобы длина составляла не менее 100 битов.
В общем случае однозначного соответствия между исходными данными и хеш-кодом нет в силу того, что количество значений хеш-функций меньше , чем вариантов входного массива; существует множество массивов с разным содержимым, но дающих одинаковые хеш-коды — так называемые коллизии . Вероятность возникновения коллизий играет немаловажную роль в оценке качества хеш-функций.
Существует множество алгоритмов хеширования с различными свойствами (разрядность, вычислительная сложность, криптостойкость и т. п.). Выбор той или иной хеш-функции определяется спецификой решаемой задачи. Простейшими примерами хеш-функций могут служить контрольная сумма или CRC.
История
Дональд Кнут относит первую систематическую идею хеширования к сотруднику IBM Хансу Петеру Луну (нем. Hans Peter Luhn ), предложившему хеш-кодирование в январе 1953 года.
В 1956 году Арнольд Думи (англ. Arnold Dumey ) в своей работе «Computers and automation» первым представил концепцию хеширования таковой, какой её знает большинство программистов сейчас. Думи рассматривал хеширование, как решение «Проблемы словаря», а также предложил использовать в качестве хеш-адреса остаток деления на простое число. [1]
Первой серьёзной работой, связанной с поиском в больших файлах, была статья Уэсли Питерсона (англ. W. Wesley Peterson ) в IBM Journal of Research and Development 1957 года, в которой он определил открытую адресацию, а также указал на ухудшение производительности при удалении. Спустя шесть лет была опубликована работа Вернера Бухгольца (нем. Werner Buchholz ), в которой проведено обширное исследование хеш-функций. В течение нескольких последующих лет хеширование широко использовалось, однако не было опубликовано никаких значимых работ.
В 1967 году хеширование в современном значении упомянуто в книге Херберта Хеллермана «Принципы цифровых вычислительных систем». В 1968 году Роберт Моррис (англ. Robert Morris ) опубликовал в Communications of the ACM большой обзор по хешированию, эта работа считается ключевой публикацией, вводящей понятие о хешировании в научный оборот и закрепившей ранее применявшийся только в жаргоне специалистов термин «хеш».
До начала 1990-х годов в русскоязычной литературе в качестве эквивалента термину «хеширование» благодаря работам Андрея Ершова использовалось слово «расстановка», а для коллизий использовался термин "конфликт" (Ершов использовал «расстановку» с 1956 года, в русскоязычном издании книги Вирта «Алгоритмы и структуры данных» 1989 года также используется термин «расстановка»). Предлагалось также назвать метод русским словом «окрошка». Однако ни один из этих вариантов не прижился, и в русскоязычной литературе используется преимущественно термин «хеширование». [3]
Виды хеш-функций
Хорошая хеш-функция должна удовлетворять двум свойствам:
- Быстро вычисляться;
- Минимизировать количество коллизий
Предположим, для определённости, что количество ключей , а хеш-функция имеет не более различных значений:
В качестве примера «плохой» хеш-функции можно привести функцию с , которая десятизначному натуральном числу сопоставляет три цифры выбранные из середины двадцатизначного квадрата числа . Казалось бы значения хеш-кодов должны равномерно распределиться между «000» и «999», но для реальных данных такой метод подходит лишь в том случае, если ключи не имеют большого количества нулей слева или справа. [3]
Однако существует несколько более простых и надежных методов, на которых базируются многие хеш-функции.
Хеш-функции, основанные на делении
Первый метод заключается в том, что мы используем в качестве хеша остаток от деления на , где - это количество всех возможных хешей:
При этом очевидно, что при чётном значение функции будет чётным, при чётном , и нечётным — при нечётном, что может привести к значительному смещению данных в файлах. Также не следует использовать в качестве степень основания счисления компьютера, так как хеш-код будет зависеть только от нескольких цифр числа , расположенных справа, что приведет к большому количеству коллизий. На практике обычно выбирают простое — в большинстве случаев этот выбор вполне удовлетворителен.
Ещё следует сказать о методе хеширования, основанном на делении на полином по модулю два. В данном методе также должна являться степенью двойки, а бинарные ключи (k_. k_" />
) представляются в виде полиномов. В этом случае в качестве хеш-кода берутся значения коэффциентов полинома, полученного как остаток от деления на заранее выбранный полином степени :
При правильном выборе такой способ гарантирует отсутствие коллизий между почти одинаковыми ключами. [3]
Мультипликативная схема хеширования
Второй метод состоит в выборе некоторой целой константы , взаимно простой с , где — количество представимых машинным словом значений (в компьютерах IBM PC " />
). Тогда можем взять хеш-функцию вида:
В этом случае, на компьютере с двоичной системой счисления, является степенью двойки и будет состоять из старших битов правой половины произведения .
Среди преимуществ этих двух методов стоит отметь, что они выгодно используют то, что реальные ключи неслучайны, например в том случае если ключи представляют собой арифметическую прогрессию (допустим последовательность имён «ИМЯ1», «ИМЯ2», «ИМЯ3»). Мультипликативный метод отобразит арифметическую прогрессию в приближенно арифметическую прогрессию различных хеш-значений, что уменьшает количество коллизий по сравнению со случайной ситуацией. [3]
Одной из вариаций данного метода является хеширование Фибоначчи, основанное на свойствах золотого сечения. В качестве здесь выбирается ближайшее к *w" />
целое число, взаимно простое с
Хеширование строк переменной длины
Вышеизложенные методы применимы и в том случае, если нам необходимо рассматривать ключи, состоящие из нескольких слов или ключи переменной длины. Например можно скомбинировать слова в одно при помощи сложения по модулю или операции «исключающее или». Одним из алгоритмов, работающих по такому принципу является хеш-функция Пирсона.
Алгоритм можно описать следующим псевдокодом, который получает на вход строку и использует таблицу перестановок
Среди преимуществ алгоритма следует отметить:
- Простоту вычисления;
- Не существует таких входных данных, для которых вероятность коллизии наибольшая;
- Возможность модификации в идеальную хеш-функцию.
В качестве альтернативного способа хеширования ключей, состоящих из символов (x_. x_" />
), можно предложить вычисление
Идеальное хеширование
Идеальной хеш-функцией (англ. Perfect hash function ) называется такая функция, которая отображает каждый ключ из набора в множество целых чисел без коллизий. В математических терминах это инъективное отображение.
Описание
Идеальное хеширование применяется в тех случаях, когда мы хотим присвоить уникальный идентификатор ключу, без сохранения какой-либо информации о ключе. Одним из наиболее очевидных примеров использования идеального (или скорее k-идеального) хеширования является ситуация, когда мы располагаем небольшой быстрой памятью, где размещаем значения хешей, связанных с данными хранящимися в большой, но медленной памяти. Причем размер блока можно выбрать таким, что необходимые нам данные, хранящиеся в медленной памяти, будут получены за один запрос. Подобный подход используется, например, в аппаратных маршрутизаторах. Также идеальное хеширование используется для ускорения работы алгоритмов на графах, в тех случаях, когда представление графа не умещается в основной памяти.
Универсальное хеширование
Универсальным хешированием (англ. Universal hashing ) называется хеширование, при котором используется не одна конкретная хеш-функция, а происходит выбор из заданного семейства по случайному алгоритму. Использование универсального хеширования обычно обеспечивает низкое число коллизий. Универсальное хеширование имеет множество применений, например, в реализации хеш-таблиц и криптографии.
Описание
Предположим, что мы хотим отобразить ключи из пространства в числа . На входе алгоритм получает некоторый набор данных и размерностью , причем неизвестный заранее. Как правило целью хеширования является получение наименьшего числа коллизий, чего трудно добиться используя какую-то определенную хеш-функцию.
.
Идеальное хеширование используется в задачах со статическим множеством ключей (т.е. после того, как все ключи сохранены в таблице, их множество никогда не изменяется) для обеспечения хорошей асимптотики даже в худшем случае. При этом мы можем дополнительно хотеть, чтобы размер таблицы зависел от количества ключей линейно.
В таком хешировании для доступа к данным потребуется лишь вычисление хеш-функций (одной или нескольких), что делает данный подход наибыстрейшим для доступа к статическим данным. Данная технология применяется в различных словарях и базах данных, в алгоритмах со статической (известной заранее) информацией.
Будем использовать двухуровневую схему хеширования с универсальным хешированием на каждом уровне.
Используется тот же принцип, что и в случае хеширования с цепочками: [math]n[/math] ключей хешируются в [math]m[/math] ячеек с использованием хеш-функции [math]h(k) = ((a\cdot k+b) \bmod p) \bmod m[/math] , случайно выбранной из семейства универсальных хеш-функций [math]H_[/math] , где [math]p[/math] — простое число, превышающее [math]m[/math] .
На данном уровне вместо создания списка ключей будем использовать вторичную хеш-таблицу [math]S_j[/math] , хранящую все ключи, хешированные функцией [math]h[/math] в ячейку [math]j[/math] , со своей функцией [math]h_j(k)=((a_j\cdot k + b_j) \bmod p) \bmod m_j[/math] , выбранной из множества [math]H_[/math] . Путем точного выбора хеш-функции [math]h_j[/math] мы можем гарантировать отсутствие коллизий на этом уровне. Для этого требуется, чтобы размер [math]m_j[/math] хеш-таблицы [math]S_j[/math] был равен квадрату числа [math]n_j[/math] ключей, хешированных функцией [math]h[/math] в ячейку [math]j[/math] .
Несмотря на квадратичную зависимость, ниже будет показано, что при корректном выборе хеш-функции первого уровня количество требуемой для хеш-таблицы памяти будет [math]O(n)[/math] .
Если [math]n[/math] ключей сохраняются в хеш-таблице размером [math]m=n^2[/math] c использованием хеш-функции [math]h[/math] , случайно выбранной из универсального множества хеш-функций, то математическое ожидание числа коллизий не превышает [math][/math] .Всего имеется [math]\dbinom[/math] пар ключей, которые могут вызвать коллизию. Если хеш-функция выбрана случайным образом из универсального семейства хеш-функций [math]H[/math] , то для каждой пары вероятность возникновения коллизии равна [math][/math] . Пусть [math]X[/math] — случайная величина, которая подсчитывает количество коллизий. Если [math]m = n^2[/math] , то математическое ожидание числа коллизий равно
Это является очень хорошим результатом, если хотя бы вспомнить на примере парадокса дней рождения о том, что вероятность коллизий растет крайне быстро по сравнению с размером хеш-таблицы.
Если мы сохраняем [math]n[/math] ключей в хеш-таблице размеров [math]m=n[/math] c использованием хеш-функции [math]h[/math] , выбираемой случайным образом из универсального множества хеш-функций, то [math]E\left[\displaystyle \sum_[math]E\left[\displaystyle \sum_^ n_j^2 \right] =[/math] [math] E\left[ \displaystyle \sum_^ (n_j + 2 \dbinom)\right] = [/math] [math] E\left[ \displaystyle \sum_^ n_j\right] + 2E\left[\displaystyle \sum_^ \dbinom\right] = [/math] [math] E\left[n\right] + 2E\left[\displaystyle \sum_^ \dbinom\right] = n + 2E\left[\displaystyle \sum_^ \dbinom \right][/math]
Первый переход в равенстве мы совершили благодаря формуле [math]a^2 = a + 2\cdot\dbinom[/math] . Далее мы воспользовались свойствами математического ожидания, в частности - линейности.
Очевидно, что [math]\displaystyle \sum_^ \dbinom[/math] - просто общее количество коллизий, поэтому по свойству универсального хеширования математическое ожидание значения этой суммы не превышает [math]\binom = = [/math] А так как [math]m = n[/math] , то
Теперь выведем 2 следствия из этой теоремы.
Если мы сохраняем [math]n[/math] ключей в хеш-таблице размером [math]m=n[/math] с использованием хеш-функции [math]h[/math] , выбираемой случайным образом из универсального множества хеш-функций, и устанавливаем размер каждой вторичной хеш-таблицы равным [math]m_j=n_j^2[/math] [math](j=0,1. m-1)[/math] , то математическое ожидание количества необходимой для вторичных хеш-таблиц в схеме идеального хеширования памяти не превышает [math]2n[/math] .Поскольку [math]m_j=n_j^2[/math] для [math]j=0,1. m-1[/math] , согласно предыдущей теореме:
Если мы сохраняем [math]n[/math] ключей в хеш-таблице размером [math]m=n[/math] с использованием хеш-функции [math]h[/math] , выбираемой случайным образом из универсального множества хеш-функций, и устанавливаем размер каждой вторичной хеш-таблицы равным [math]m_j=n_j^2[/math] [math](j=0,1. m-1)[/math] , то вероятность того, что общее количество необходимой для вторичных хеш-таблиц памяти не менее [math]4n[/math] , меньше чем [math][/math] .Применим неравенство Маркова [math]P(X \geqslant t) \leqslant E[X]/t[/math]
Поскольку мы знаем, что Java является объектно-ориентированным языком, следовательно, должен существовать механизм для описания состояния объекта, независимо от того, насколько большим может быть объект. Хеш-функция в Java появилась для выполнения этого требования.
Что такое функция хеширования?
Хэш-функция может быть определена как функция, которая возвращает целочисленное значение, соответствующее объекту. Хэш-функция всегда возвращает одно и то же целочисленное значение для одного и того же объекта. Целочисленное значение, возвращаемое хэш-функцией, называется значением хеш-функции. Ниже приведены важные моменты, касающиеся функции хеширования:
- Всегда возвращает целое число (4 байта) для объекта.
- Мы не можем вычислить состояние объекта из хеш-значения, то есть хеш-функции необратимы по своей природе.
- Два равных объекта будут иметь одинаковое хеш-значение.
- Два неравных объекта не всегда имеют разные значения Hash.
Применение хэш-функции
Вот общие применения хеш-функций:
1. Структуры данных
Почти каждый язык программирования содержит структуры данных, основанные на хэше. Например, java содержит хэш-таблицу, хэш-карту, хэш-набор, структуры данных дерева, основанные на хэш-функции. Основой этих структур данных является дизайн Key-Value, в котором каждый ключ уникален, тогда как для нескольких ключей может существовать одно и то же значение.
3. Безопасный алгоритм хеширования
Этот алгоритм используется для защиты данных и используется в приложениях и протоколах, таких как Secure Socket Layer (SSL). SHA-0, SHA-1, SHA-2 и SHA-3 являются общими категориями алгоритма безопасного хеширования.
4. Проверка и хранение пароля
Давайте рассмотрим сценарий входа в систему, в котором при вводе пароля для аутентификации пользователя вычисляется хеш-значение введенного пароля и отправляется по сети на сервер, где хранится хеш-код оригинала. Это сделано для того, чтобы при пересылке пароля с сервера на сервер не было обнаружено никакого сниффинга.
5. Работа компилятора
Поскольку в языке программирования используются разные ключевые слова, чтобы различать эти ключевые слова и идентификаторы, компилятор использует хэш-набор, который реализован с использованием хэш-таблицы для хранения всех этих ключевых слов и идентификаторов.
6. Алгоритм Рабина-Карпа
Это алгоритм поиска, который использует хеширование для поиска одного или нескольких шаблонов в заданной строке. Это один из наиболее часто используемых алгоритмов.
7. Сопоставимые и компараторские интерфейсы
Эти интерфейсы содержат функции, которые используются для сравнения двух объектов одновременно. Возвращаемое значение этих функций может быть отрицательным, нулевым или положительным в зависимости от того, является ли данный объект меньше, равен или больше, чем объект, с которым мы сравниваем. Внутренне компаратор и сопоставимые интерфейсы используют хэш-функцию для сравнения объектов друг с другом.
8. Очередь приоритетов
Очередь с приоритетом отличается от обычной очереди, которая следует порядку FIFO (первый пришел первым вышел). В очереди приоритетных элементов расположены в произвольном порядке на основе их приоритета, который реализован внутри с использованием сопоставимых и компаратор, которые стажеры основаны на хэш-функциях.
Проектирование хеш-функций
Вот некоторые общие принципы проектирования для создания хеш-функций:
- Хэш-функция должна быть эффективно оценена.
- Хеш-значения, вычисленные по хеш-функциям, должны быть равномерно распределены, это помогает избежать коллизий.
- Язык программирования Java предоставляет общую функцию хеширования с помощью метода hashCode () в суперклассе Object.
public int hashCode ()(
//Logic goes here
)
Столкновение хэшей в Java
Столкновение хеш-функции происходит, когда два или более объекта возвращают одно и то же хеш-значение. Давайте возьмем пример карты хэша Java, которая хранит данные в парах ключ-значение. Когда мы помещаем объект в хэш-карту, вычисляется хэш-значение ключа, и на основе этого местоположения хэш-значения определяется место хранения объекта значения. Объекты с разными значениями хеша должны входить в разные сегменты. Когда два или более объекта имеют одинаковое значение хеш-функции, они сохраняются в одном и том же месте группы, используя дополнительную структуру данных, называемую связанным списком. Все объекты, имеющие одно и то же значение хеш-функции, объединяются в один связанный список. Этот механизм называется цепочкой. Ниже приведены способы обработки столкновений с помощью хэш-функции:
- Цепочка: как уже говорилось, идея цепочки заключается в создании связанного списка объектов, имеющих одинаковое значение хеш-функции. Цепочка является простой техникой, но требует дополнительных затрат памяти.
- Открытая адресация. В этом методе все элементы хранятся в хеш-таблице, в которой каждая запись содержит запись или значение NULL. Когда выполняется поиск элемента, в каждой записи в хеш-таблице выполняется поиск нужной записи, пока не будет найдена требуемая запись или пока не будет сделан вывод, что запись не существует в таблице.
Преимущества хеширования
Ниже приведены преимущества хеширования:
Недостатки хеширования
Помимо преимуществ, существуют также некоторые ограничения хеширования:
- Хеширование не может быть реализовано для сортировки данных.
- Столкновения хешей практически невозможно избежать, что, в свою очередь, приводит к неэффективности.
Рекомендуемые статьи
Это руководство по функции хеширования в Java. Здесь мы обсуждаем применение хэш-функции наряду с преимуществами и недостатками. Вы также можете посмотреть следующие статьи, чтобы узнать больше -
Читайте также: