2009-11-06 4 views
2

Есть ли хеш-функция, где небольшие изменения во входном результате приводят к небольшим изменениям в выходе? Например, что-то вроде:Функция хэширования, которая отображает аналогичные входы на аналогичные выходы?

hash("Foo") => 9e107d9d372bb6826bd81d3542a419d6 
hash("Foo!") => 9e107d9d372bb6826bd81d3542a419d7 <- note small difference 
+1

Это будет * действительно * плохой алгоритм хеширования .... – skaffman

+0

Для криптографического хэша, да, это было бы плохо, но я хочу использовать его для чего-то другого. –

+0

Я думаю, вам нужно предоставить более подробную информацию о том, какова назначенная цель такой функции. Существует определенно нет криптографической хэш-функции с этим свойством, но, возможно, вы ищете что-то другое? – Krystian

ответ

0

Тривиальное решение будет состоять в XOR всех байт-модулях N. Например. для 64-битного хэша вы бы установили XOR (вход [0]^вход [8]^вход [16]) + 256 * (вход [1]^вход [9]^вход [17]) и т. д. Итак, «Foo» хеширует «Foo \ 0 \ 0 \ 0 \ 0 \ 0» и «Foo!» хэшам на «Foo! \ 0 \ 0 \ 0 \ 0".

4

Я бы не назвал это хешем, потому что точка хэша в точности противоположна. Однако, с вашей заявленной целью небольших изменений ввода, создающих небольшие изменения в выходе, я бы посмотрел на использование либо функции soundex, либо алгоритма Ratcliff.

0

Чувствительный к местоположению хеширование (LSH) уменьшает размерность высокоразмерные данные. LSH хеши входных элементов так, чтобы подобные детали карты для один и того же «ведра» с высокой вероятностью:

https://en.wikipedia.org/wiki/Locality-sensitive_hashing

Также см: https://en.wikipedia.org/wiki/Perceptual_hashing

Вот хороший пример перцептивного хэширования на последовательности ДНК :

http://arxiv.org/pdf/1412.5517.pdf

Смежные вопросы