6

有一个有趣的问题 - 我需要将 2 个(随机)生成的 Guid 转换为一个字符串。以下是约束:

  1. 字符串最大 50 个字符长度。
  2. 只能使用数字和小写字母 (0123456789abcdefghijklmnopqrstuvwxyz)
  3. 该算法必须是 2 路 - 需要能够将编码的字符串解码为相同的 2 个单独的 guid。

到目前为止,我已经浏览了很多寻找 toBase36 转换 bo 的 Guid 没有运气。

有任何想法吗?(C#)

4

1 回答 1

10

首先,您很幸运,36^50 大约是 2^258.5,因此您可以将信息存储在 50 字节的 base-36 字符串中。不过,我想知道为什么有人必须为此使用 base-36。

您需要将每个 GUID 视为一个 128 位数字,然后将它们组合成一个 256 位数字,然后将其转换为 base-36 的“数字”。转换回来是反向做同样的事情。

Guid.ToByteArray将 GUID 转换为 16 字节数组。对两个 GUID 都执行此操作,您将拥有一个 32 字节(即 256 位)的数组。从该数组构造一个BigInt(有一个构造函数),然后将该数字转换为 base-36。

要将数字转换为 base-36,请执行以下操作(我假设一切都是正数)

const string digits = "0123456789abcdefghijklmnopqrstuvwxyz";

string ConvertToBase36(BigInt number)
{
    string result = "";
    while(number > 0)
    {
        char digit = string[number % 36];
        result += digit;
        number /= 36;
    }
}
于 2012-03-17T00:53:45.100 回答