如何将两个Guid转换为最多50个字符长度的字符串(双向转换)?

6
我有一个有趣的问题 - 我需要将2个(随机生成的)Guid转换为字符串。以下是限制条件:
  1. 字符串最长为50个字符。
  2. 只能使用数字和小写字母(0123456789abcdefghijklmnopqrstuvwxyz)。
  3. 算法必须是双向的 - 需要能够将编码后的字符串解码成相同的2个分离的guid。
我浏览了很多关于toBase36转换的内容,但迄今为止没有找到与Guid相关的内容。
有什么想法吗?(C#)

找到了一个解决方案 http://www.codeproject.com/Articles/16035/Base-Conversion-of-Very-Long-Positive-Integers - user1275154
1个回答

10
首先,你非常幸运,36的50次方约为2的258.5次方,因此你可以将信息存储在一个50字节的基于36进制的字符串中。不过,我想知道为什么有人要使用基于36进制。
你需要把每个GUID看作是一个128位的数字,然后将它们组合成一个256位的数字,再将其转换为一个基于36进制的“数字”。反向转换也是相同的方法。
Guid.ToByteArray会将GUID转换为一个16字节数组。对两个GUID执行此操作,就会得到一个32字节(即256位)的数组。从该数组构造一个BigInt(有一个构造函数),然后只需将该数字转换为基于36进制的数字即可。
要将数字转换为基于36进制的数字,请执行以下操作(假设一切皆为正数)。
const string digits = "0123456789abcdefghijklmnopqrstuvwxyz";

string ConvertToBase36(BigInt number)
{
    string result = "";
    while(number > 0)
    {
        char digit = string[number % 36];
        result += digit;
        number /= 36;
    }
}

谢谢!我该如何将BigInt转换为36进制?这就是我正在努力解决的问题... - user1275154
我不明白这是如何工作的。结果为 null。所以你每次循环都在一个空值上运行模数。这意味着你的结果将是 null。 - Bob
你发现了一个错别字。应该写成数字 % 36。 - zmbq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接