【问题标题】:Show a GUID in 36 letters format以 36 个字母格式显示 GUID
【发布时间】:2011-01-16 14:40:37
【问题描述】:

GUID 是在HEX 基础上显示的大随机数。我想以较短的格式显示这个数字,可以说是基于所有字母和数字。那是36个基。

假设:2f1e4fc0-81fd-11da-9156-00036a0f876a 将变为 3jEl9x6eZi

.Net 中是否有任何“准备好”的算法?

它需要是双向的。

编辑:使用Base64 是更好的解决方案。唯一的问题是 Base64 包含 / 字符,不兼容在 URI 中使用。

【问题讨论】:

  • 对于 base 64,您可以用有效(但尚未使用)的字符替换无效字符。 IIRC,可打印的 ASCII 字符略少于 96 个。
  • 看看我的回答,看看我是如何解决 ==、/ 和 + 问题的

标签: c# .net guid base64


【解决方案1】:

Base64 是我使用的,this 将解决 == 和 / 和 + 的问题

【讨论】:

    【解决方案2】:

    这不可能,正如你所介绍的那样。您将不得不丢失信息:

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

    您需要更多以 36 为基数的数字才能涵盖所有可能的值。为什么不直接使用 base 64 呢?结果会更短(我假设这是这里的目标),并且 .NET 中有一个标准解决方案。

    【讨论】:

    • 3jEl9x6eZi 的值仅作为示例,并非“真实”值。
    【解决方案3】:

    我认为您会发现最接近的是 Base36,但它不适用于 GIUD 类型(仅 Int16、Int32 或 Int64)。

    【讨论】:

      【解决方案4】:

      这种转换没有内置任何东西。内置的东西接近使用 base 64 编码:

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

      【讨论】:

      • 很好的解决方案。但是为什么每个字符串都以 '==' 结尾? = 这不是 Base64 格式的有效值。
      • @Mendy:= 字符用于填充最后一个字符组。 (在 RFC 1421 标准中指定。)
      【解决方案5】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-04
        • 1970-01-01
        • 2011-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-09
        相关资源
        最近更新 更多