创建唯一的URL安全哈希

时间:2012-09-07 15:25:56

标签: c# encryption hash

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

它需要满足以下要求:

  1. 必须以字母或数字开头,并且只能包含字母和数字。
  2. 容器名称中的所有字母都必须小写。
  3. 长度必须为3到63个字符(尽管越短越好)
  4. 结果不需要是可逆的,只是可重复的 - 所以单向散列就可以了。

3 个答案:

答案 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>