Здесь много полезного о различных хеш-функциях. Я не думаю, что кто-то делает то, что вы просите. Все они будут иметь столкновения.
Возможно, вам следует проверить некоторые простые алгоритмы шифрования.
Вот простой метод шифрования, который может делать то, что вы хотите:
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