我需要单向哈希字母数字+特殊字符(ascii)可变长度字符串(10-20个字符)。 输出应该是可变长度的,但最多25个字符长,字母数字和不区分大小写。
此外,我不想产生碰撞,所以我需要一些无碰撞的东西,或者至少没有证明(但是?)产生碰撞。
答案 0 :(得分:1)
Here是关于不同哈希函数的很多好东西。我不认为你做的是什么。他们都会发生碰撞。
也许您应该查看一些简单的加密算法。
这是一种简单的加密技术,可以做你想要的:
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()总是为给定的种子生成相同的数字流,因此您的“哈希”不会发生冲突并且可以解密。
如果您希望哈希是“单向”...那么扔掉密钥!