我的目标是为一个长度为42个不区分大小写的字母数字字符的字符串生成一个6个字符(可能包含字符A-Z0-9)的短Hash字符串。唯一性是关键要求。安全性或性能并不那么重要。
有没有特定的算法可以给出这个结果,或者我应该坚持截断MD5散列或Like in this question散列?如果是这样,碰撞的概率是多少?
发布于 2013-08-27 20:22:23
简单散列:)
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);
}发布于 2013-08-29 09:56:28
最好的解决方案几乎肯定是使用SHA1,转换为Base62 (尽管Base64会更容易,因为它内置在框架Convert.ToBase64String中。您必须做一些工作来寻找一个像样的Base62库),然后将输出截断为6字节。
我不会使用GetHashCode(),因为它有一个history of collision problems。(我并不是说这个特定的bug适用于您,只是提到这一点,作为GetHashCode在过去没有很好实现的证据。)
我也不会实现自定义的哈希算法,很容易意外地写出一个冲突率很高的算法。已经对SHA1和其他主要的散列算法进行了大量的研究和审查,您很难找到更好的算法。
https://stackoverflow.com/questions/18464517
复制相似问题