我的目标是为一个长度为42个大小写不敏感的字母数字字符的字符串生成一个包含[A-Z][a-z][0-9]字符的6个字符的短哈希字符串。唯一性是主要要求,安全性或性能并不那么重要。
是否有特定的算法可以达到这个结果,还是应该坚持截取MD5哈希或SHA-1哈希 (就像这个问题中的方法)?如果有,那么碰撞的概率是多少?
我的目标是为一个长度为42个大小写不敏感的字母数字字符的字符串生成一个包含[A-Z][a-z][0-9]字符的6个字符的短哈希字符串。唯一性是主要要求,安全性或性能并不那么重要。
是否有特定的算法可以达到这个结果,还是应该坚持截取MD5哈希或SHA-1哈希 (就像这个问题中的方法)?如果有,那么碰撞的概率是多少?
这个公式只适用于小的K值,但它表明,在哈希表中有100K个条目时,你大约有17%的碰撞几率。
Pcollision = K^2 / N
,而不是Pcollision = K^2 / 2N
? - Alex Moore-Niemi简单的哈希 :)
private string Hash(string str)
{
var allowedSymbols = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".ToCharArray();
var hash = new char[6];
for (int i = 0; i < str.Length; i++)
{
hash[i % 6] = (char)(hash[i % 6] ^ str[i]);
}
for (int i = 0; i < 6; i++)
{
hash[i] = allowedSymbols[hash[i] % allowedSymbols.Length];
}
return new string(hash);
}
hash[i % 6] ^ str[i]
中的 XOR 运算,该算法具有较高的冲突率。原文指出输入字符串对大小写不敏感,对于所有字符,a-z 和 A-Z 的最高两位都相同。即使使用了所有常规可打印 ASCII 字符(0x20-0x7e),对于字符集的 66%,最高两位仍然相同。 - SyonGetHashCode
过去实现得不好的证据。)