加密int生成唯一字符串和Decrypt字符串以再次获取int

时间:2014-03-13 14:55:32

标签: c# sql encryption

我需要从int number(id)开始生成唯一的字符串。长度必须按比例递增,因此对于微小的ID,我必须生成四个字符的唯一字符串。对于大型ID,我必须生成更复杂的字符串,并在需要时增加大小(最多8位)以实现唯一性。 所有这些程序必须完成两个相反的功能:

来自id - >获取字符串

来自字符串 - >获取id

唯一字符串必须由特定集合的数字和字符组成(379CDEFHKJLMNPQRTUWXY)

有没有一个众所周知的算法来做到这一点?我需要在c#或更好的tsql中执行此操作。我们也很感激。

修改

我“简单地”需要对数字进行编码(而不是解码)。我已经为我的字母表实现了这个例程(21个符号长度): 编码:

public static String BfEncode(long input)
{
    if (input < 0) throw new ArgumentOutOfRangeException("input", input, "input cannot be negative");
    char[] clistarr = BfCharList.ToCharArray();
    var result = new Stack<char>();
    while (input != 0)
    {
        result.Push(clistarr[input % 21]);
        input /= 21;
    }
    return new string(result.ToArray());
} 

解码:

public static Int64 BfDecode(string input)
{
    var reversed = input.ToLower().Reverse();
    long result = 0;
    int pos = 0;
    foreach (char c in reversed)
    {
        result += BfCharList.IndexOf(c.ToString().ToUpper()) * (long)Math.Pow(21, pos);
        pos++;
    }
    return result;
}

我在从10000到10000000(!)的循环中生成了示例字符串。从10K开始,我可以生成4位数的字符串。在这一代之后,我将所有字符串放在列表中并检查其唯一性(我已经使用并行foreach完成了它...)。在数字122291处,例程抛出异常,因为存在重复!有可能吗? 基本转换为自定义字母表不是一个好的解决方案?

0 个答案:

没有答案