有一个有趣的问题 - 我需要将 2 个(随机)生成的 Guid 转换为一个字符串。以下是约束:
- 字符串最大 50 个字符长度。
- 只能使用数字和小写字母 (0123456789abcdefghijklmnopqrstuvwxyz)
- 该算法必须是 2 路 - 需要能够将编码的字符串解码为相同的 2 个单独的 guid。
到目前为止,我已经浏览了很多寻找 toBase36 转换 bo 的 Guid 没有运气。
有任何想法吗?(C#)
首先,您很幸运,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;
}
}