Односторонний хеш с буквенно-цифровым выводом переменной длины

Мне нужно в одну сторону хешировать буквенно-цифровые + специальные символы (ascii) строки переменной длины (10-20 символов). Вывод должен иметь переменную длину, но не более 25 символов, буквенно-цифровой и нечувствительный к регистру.

Также я не хочу создавать столкновения, поэтому мне нужно что-то свободное от столкновений или, по крайней мере, не доказанное (пока?) для создания столкновений.


person Chris L.    schedule 26.04.2012    source источник
comment
Я думал, что весь смысл хэша в том, чтобы создать что-то меньшее, чем исходные данные, которые вы можете использовать в качестве достаточно уникального идентификатора. Так что коллизии будут всегда. Я думаю, вы хотите что-то другое, чем хэш.   -  person johnnycrash    schedule 03.06.2012
comment
@johnnycrash хэш должен быть меньше, но это не значит, что бесполезно контролировать размер хеша. Фильтры Блума требуют изменения длины хеша.   -  person Justin Tanner    schedule 04.12.2014


Ответы (1)


Здесь много полезного о различных хеш-функциях. Я не думаю, что кто-то делает то, что вы просите. Все они будут иметь столкновения.

Возможно, вам следует проверить некоторые простые алгоритмы шифрования.

Вот простой метод шифрования, который может делать то, что вы хотите:

char szInput = "hash me", szOutput[20], szKey = "foo";
int i, cbKey = strlen(szKey), cbInput = strlen(szInput);

for (i=0 ; i<cbInput ; ++i)
  szOutput[i] = szInput[i]^szKey[i%cbKey];  // xor with a differnt char from the key

Вы не узнаете вывод, и он не столкнется, так как он обратим.

Другой способ, который труднее расшифровать, заключается в использовании текущего символа в ключе в качестве количества вызовов, которые вы должны сделать для rand(). Xor, использующий результат последнего вызова rand(). Поскольку rand() всегда создает один и тот же поток чисел для данного начального числа, ваш «хэш» не будет конфликтовать и может быть расшифрован.

Если вы хотите, чтобы хэш был "односторонним"... тогда выбросьте ключ!

person johnnycrash    schedule 03.06.2012
comment
Благодарю вас! Это отличная отправная точка. Я думаю, я искал в неправильном направлении, как вы упомянули в своем комментарии. - person Chris L.; 29.06.2012