Односторонний хэш с буквенно-цифровым выводом переменной длины
Мне нужно в одну сторону хешировать буквенно-цифровые + специальные символы (ascii) строки переменной длины (10-20 символов). Выходные данные должны иметь переменную длину, но не более 25 символов, алфавитно-цифровую и без учета регистра.
Также я не хочу создавать коллизии, поэтому мне нужно что-то без коллизий или, по крайней мере, не проверено (пока?) Для создания коллизий.
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 () всегда генерирует один и тот же поток чисел для данного начального числа, ваш "хеш" не будет конфликтовать и может быть расшифрован.
Если вы хотите, чтобы хеш был "односторонним"... тогда выбросьте ключ!