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

Мне нужно в одну сторону хешировать буквенно-цифровые + специальные символы (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 () всегда генерирует один и тот же поток чисел для данного начального числа, ваш "хеш" не будет конфликтовать и может быть расшифрован.

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

Другие вопросы по тегам