2

我需要一种方法散列可变长度(10-20 个字符)的字母数字 + 特殊字符(ascii)字符串。输出应为可变长度,但最长为 25 个字符,字母数字且不区分大小写。

另外我不想产生碰撞,所以我需要一些无碰撞或至少没有被证明(还没有?)的东西来产生碰撞。

4

1 回答 1

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() 的计数。使用最后一次调用 rand() 的结果进行异或运算。由于 rand() 总是为给定的种子生成相同的数字流,因此您的“哈希”不会发生冲突并且可以被解密。

如果您希望哈希是“一种方式”......然后扔掉钥匙!

于 2012-06-03T04:35:55.520 回答