我需要一种方法散列可变长度(10-20 个字符)的字母数字 + 特殊字符(ascii)字符串。输出应为可变长度,但最长为 25 个字符,字母数字且不区分大小写。
另外我不想产生碰撞,所以我需要一些无碰撞或至少没有被证明(还没有?)的东西来产生碰撞。
我需要一种方法散列可变长度(10-20 个字符)的字母数字 + 特殊字符(ascii)字符串。输出应为可变长度,但最长为 25 个字符,字母数字且不区分大小写。
另外我不想产生碰撞,所以我需要一些无碰撞或至少没有被证明(还没有?)的东西来产生碰撞。
这里有很多关于不同哈希函数的好东西。我不认为任何人做你所要求的。它们都会发生碰撞。
也许你应该看看一些简单的加密算法。
这是一种简单的加密技术,可以满足您的要求:
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() 的计数。使用最后一次调用 rand() 的结果进行异或运算。由于 rand() 总是为给定的种子生成相同的数字流,因此您的“哈希”不会发生冲突并且可以被解密。
如果您希望哈希是“一种方式”......然后扔掉钥匙!