我想散列/编码一个唯一的整数(数据库 ID)来创建一个类似的唯一字符串。
它需要满足以下要求:
- 必须以字母或数字开头,并且只能包含字母和数字。
- 容器名称中的所有字母都必须小写。
- 长度必须为 3 到 63 个字符(尽管越短越好)
结果不需要是可逆的,只是可重复的 - 所以单向哈希就可以了。
我想散列/编码一个唯一的整数(数据库 ID)来创建一个类似的唯一字符串。
它需要满足以下要求:
结果不需要是可逆的,只是可重复的 - 所以单向哈希就可以了。
一个简单的解决方案是 base 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;
}
为什么不能使用 Class 使用 base 64 编码的 MD5 或使用 Class 的SHA1MD5CryptoServiceProvider
是否有原因?我不知道基于 36 的密码分析,但我猜想 MD5 或 SHA1 的碰撞率可能更好。SHA1CryptoServiceProvider
如果您对可逆(如 Base36)感到满意,那么已经内置了 Base16(十六进制)格式,这可能也可以稍微隐藏普通人的数字:String.Format("{0:x}", 1235)
或12345.ToString("x")