1

我想散列/编码一个唯一的整数(数据库 ID)来创建一个类似的唯一字符串。

它需要满足以下要求:

  1. 必须以字母或数字开头,并且只能包含字母和数字。
  2. 容器名称中的所有字母都必须小写。
  3. 长度必须为 3 到 63 个字符(尽管越短越好)

结果不需要是可逆的,只是可重复的 - 所以单向哈希就可以了。

4

3 回答 3

4

一个简单的解决方案是 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;
}
于 2012-09-07T15:30:36.570 回答
1

为什么不能使用 Class 使用 base 64 编码的 MD5 或使用 Class 的SHA1MD5CryptoServiceProvider是否有原因?我不知道基于 36 的密码分析,但我猜想 MD5 或 SHA1 的碰撞率可能更好。SHA1CryptoServiceProvider

于 2012-09-07T15:36:27.313 回答
1

如果您对可逆(如 Base36)感到满意,那么已经内置了 Base16(十六进制)格式,这可能也可以稍微隐藏普通人的数字:String.Format("{0:x}", 1235)12345.ToString("x")

于 2012-09-07T16:25:36.327 回答