Есть ли нежная хэш-функция?
Смущающе, выбор хэш-функции (скажем, для хеширующих строк или наборов целых чисел и т.д.) по-прежнему магия для меня: возьмите здесь несколько простых чисел, магические константы там, немного сдвиньте бит, по модулю что-то и сделайте,
Есть ли хороший, нежный и доступный учебник о создании хеш-функций?
Ответы
Ответ 1
Любопытно, как трудно найти основное объяснение хэш-алгоритмов. Может быть, тема настолько сложная, что нелегко сделать основной учебник. Я искал один сам и столкнулся с той же проблемой.
Но вы можете попробовать эту страницу. Что круто, так это то, что после того, как вы прочитаете страницу, внизу появится текстовое поле. Если вы добавите текст в это поле и отправьте форму, результатом будет пошаговый список того, как он хэширует входной текст.
http://www.metamorphosite.com/one-way-hash-encryption-sha1-data-software
Удачи. Если вы найдете что-нибудь лучше, было бы очень полезно, если бы вы разместили его здесь.
Ответ 2
Вы можете найти достойный, простой хэш-учебник по Hash Table Tutorial (также обсуждает хеш-функции). Обратите внимание: если вы выполняете поиск в Интернете, вы можете найти много хорошей информации.
Википедия имеет некоторую базовую информацию о Hash Tables и Хеш Функции.
ИЗМЕНИТЬ
Ранее был задан аналогичный вопрос: Какую функцию Hash я должен выбрать. Вопрос и ответы превосходны.
Ответ 3
Я нашел эту ссылку немного полезной. Это дает базовый обзор, но не позволяет полностью понять такие вещи, как, например, почему, смена бит и т.д.
http://www.i-programmer.info/babbages-bag/479-hashing.html
Из этой ссылки выделите какой-нибудь раздел, в котором дается обзор
Что делает хорошую хэш-функцию
Большинство хороших функций хеширования работают, вычисляя остаток после деления на размер таблицы N.
Это всегда дает значение между 0 и N-1, поэтому оно подходит, но если N - простое число, то оно также отлично подходит для рассеяния данных вокруг таблицы. Конечно, если у вас есть текстовое значение, которое вы хотите использовать, вы должны сначала преобразовать его в подходящее числовое значение, а простая схема, подобная той, что приведена в примере, не будет выполнена.
Вам нужно создать другое числовое значение для каждого возможного текстового значения, и сложение кодов ASCII первых двух букв явно не работает. Лучшим способом является взвешивание каждого из кодов ASCII положением буквы путем умножения на 1 для первого символа, 10 для второго, 100 для третьего и т.д., Прежде чем добавлять их для получения одного значения.
В общем случае создание действительно хорошей хэш-функции затруднено, и в большинстве случаев вам нужно найти тот, который обладает хорошими свойствами и был хорошо протестирован.