我想散列/编码一个唯一的整数(数据库ID)来创建一个类似的唯一字符串。
它需要满足以下要求:
结果不需要是可逆的,只是可重复的 - 所以单向散列就可以了。
答案 0 :(得分:4)
一个简单的解决方案是基本36编码。输出将是一个介于六个字符之间的字符串。
public static string EncodeBase36(int i)
{
Contract.Requires<ArgumentException>(i>=0);
//Base conversion
string s="";
while(i!=0)
{
int digit = i % 36;
i/=36;
if(digit<10)
s=((char)('0'+digit)).ToString()+s;
else
s=((char)('a'+digit-10)).ToString()+s;
}
// Enforce minimum length
while(s.Length<3)
{
s = "0" + s;
}
return s;
}
答案 1 :(得分:1)
是否有理由不能使用MD5CryptoServiceProvider
Class使用SHA1CryptoServiceProvider
Class或SHA1使用基础64编码的MD5?我不知道基数为36的密码分析,但我猜想MD5或SHA1的碰撞率可能更好。
答案 2 :(得分:1)
如果您可以使用可逆(如Base36),那么已经内置的Base16(十六进制)格式可能会有效地隐藏常规用户的数字:String.Format("{0:x}", 1235)
或12345.ToString("x")
< / p>