以36个字符的格式显示GUID

11

GUID 是一个以 十六进制 为基础的大随机数。我想将这个数字以更短的格式展示,比如基于所有字母和数字的36进制。

比如说:2f1e4fc0-81fd-11da-9156-00036a0f876a 将会变成 3jEl9x6eZi

在 .Net 中有任何现成的算法可以实现这个功能吗?

需要实现双向转换。

编辑: 使用Base64是更好的解决方案。唯一的问题是 Base64 包含无法用于URI/字符。


对于 Base64,您可以使用有效的(但尚未使用过的)字符替换无效字符。如果我没记错,可打印的 ASCII 字符略少于 96 个。 - user180247
看看我的答案,看我是如何解决 ==、/ 和 + 问题的。 - Fredou
5个回答

13

9

并没有为这样的转换内置任何内容。内置的类似功能是使用base64编码:

string base64 = Convert.ToBase64String(theGuid.ToByteArray())

好的解决方案。但是为什么每个字符串都以“==”结尾?因为在Base64格式中,=不是有效值。 - Fitzchak Yitzchaki
3
@Mendy:等号字符被用来填充最后一个字符组。(这在RFC 1421标准中规定。) - Guffa

2

按照您的描述,这是不可能的。您必须失去一些信息:

>>> 16 ** len('2f1e4fc081fd11da915600036a0f876a')
340282366920938463463374607431768211456
>>> 36 ** len('3jEl9x6eZi')
3656158440062976

如果要涵盖所有可能的值,您需要更多的36进制数字。为什么不改用64进制呢?结果会更短(我假设这是目标),而且在.NET中有一个标准解决方案。


3jEl9x6eZi 仅为示例,它不是“真实”值。 - Fitzchak Yitzchaki

1

Base64是我使用的,this 可以解决等号、斜杠和加号的问题。


1

我认为你能找到的最接近的是Base36,但它不能与GUID类型一起使用(仅适用于Int16、Int32或Int64)。


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