【问题标题】:How many characters are there in a GUID?GUID 中有多少个字符?
【发布时间】:2010-10-11 02:17:08
【问题描述】:

使用 ASCII 编码,一个 GUID 中有多少个字符?

我对 Microsoft 样式感兴趣,其中包括大括号和破折号。

【问题讨论】:

  • 它们的长度完全相同。如果您将字符数为一个,您将知道所有字符的长度。
  • @Greg - 这是一个非常糟糕的假设,除非你明白长度不会改变。
  • 如果长度不同,那么这个问题就像在问“一根绳子有多长?”相反,这是在问“一打有多少个鸡蛋?”
  • 当我用谷歌搜索这个问题时,每个答案都指向一个 guid 的定义。如果你愿意,可以投我的票,但我只是想让这个特定问题的答案更容易找到,以后的提问者不需要计数。
  • 我明白你在说什么,但如果有人刚刚被介绍给 NewDataX,那么关于长度的问题是有效的,你不能假设你所看到的就是其他所有 NewDataX 的例子直到您了解 NewDataX 是什么。

标签: encoding guid


【解决方案1】:

来自MSDN

GUID 是一个 128 位的值,包括 一组8个十六进制数字, 紧随其后的是三组 4 每个十六进制数字,后跟 一组 12 位十六进制数字。 以下示例 GUID 显示 a中的十六进制数字分组 图形用户界面: 6B29FC40-CA47-1067-B31D-00DD010662DA

来自Wikipedia

通常会添加大括号来包围 以上格式,如:

{3F2504E0-4F89-11D3-9A0C-0305E82C3301}

所以在典型的带花括号的十六进制编码中总共有 38 个字符。

-亚当

【讨论】:

  • @magnifico -- 请参阅此答案的最后一段:“因此,在带有花括号的典型十六进制编码中总共有 38 个字符。”
  • 无需与 magnifico 争吵 - 他提出问题,他可以决定谁给出了最相关的答案。我敢肯定,他有理由更喜欢另一个答案而不是这个答案。
  • @Beska 因为这就是 Stack Overflow 的用途。与其把一条鱼交给一个人,不如把一条鱼交给一百万人。
  • @bugloaf 嗯。我怀疑我的两个 cmets 都提到了已删除的内容,因为它们在当前上下文中毫无意义……而第一个非常具体地是对 something 消失的回应。我已经摆脱了他们。 (在目前的情况下,我似乎在反对答案,这是一个很好的答案,对我来说没有任何意义,而且你说得对。)
  • @AdamDavis 我数的是 32 而不是 38。编辑:你一定在数大括号和破折号,没关系。
【解决方案2】:

正如 Adam 在 MSDN 引用中提到的,UUID 是 128 位值。这意味着它们需要 16 字节的 RAM 来保存一个值。一个文本表示将占用 32 个字节(每个单个字节两个字节),加上 4 个连字符,加上两个括号,如果你想包含它们;这相当于 38 个字节。

请记住,如果您向软件用户公开 UUID,他们可能会提供带括号或不带括号的 UUID。如果您将值存储在任何地方,最好将其存储为 16 字节二进制表示。如果您正在与其他 UUID 实现进行互操作,您可能希望使用基本文本格式来实现互操作,因为不同的实现在存储二进制 UUID 值时对字节顺序执行不同的操作。

【讨论】:

    【解决方案3】:

    TL;DR:无。

    正如 Adam Davis 所说,Microsoft 风格是 HEX 编码(带有大括号和破折号以使其更具可读性),可以使用 ASCII 字符的子集(0-9 和 AF)来显示,但这并不是专门的 ASCII 编码.

    我想重要的是要记住显示 GUID 的 microsoft 样式只是 GUID 的表示,它实际上是一个 16 字节的整数值(如 Micheal Trausch 所述)。

    您还可以通过将字节转换为不同的字符集(如 ASCII)以不同、更紧凑的方式呈现它。

    理论上,您可以将每个字节显示为扩展的 ASCII 字符(255 个字符),这样您就可以将 GUID 保存为 16 个字符长度的字符串。

    但它的可读性不是很好,因为它会包含空白字符(CR、空格、制表符等)和其他特殊字符,因此只有在您想有效地将​​ GUID 保存在非人类中时这才有意义可读的字符格式,例如在不支持 GUID 或快速匹配小二进制值的数据库中: http://en.wikipedia.org/wiki/Extended_ASCII

    恕我直言,显示更紧凑的 GUID 最易读的方法是使用 Base64 编码,它允许您将其保存在长度为 22 个字符的字符串中,并使其看起来像这样:

    7v26IM9P2kmVepd7ZxuXyQ==
    

    但正如 Jeff Atwood 在他的网站上所说,您还可以将 GUID 推送到 20 个字符的 ASCII85 编码字符串中:

    [Rb*hlkkXVW+q4s(YSF0
    

    如需更多灵感,请参阅: http://www.codinghorror.com/blog/2005/10/equipping-our-ascii-armor.html

    【讨论】:

    • 我在这里用 C# 发布了一个 Ascii-85 编码器/解码器:stackoverflow.com/questions/2827627/…
    • 如果这个答案的顶部有一个大而粗的“无”来吸引读者并充当 TL;DR。 ;)
    【解决方案4】:

    长度取决于编码。你可以用这个 sn-p 得到标准的编码和长度:

    public void Main() 
    {
        var guid = Guid.Empty;
        Write(guid, "N"); // 32 characters
        Write(guid, "D"); // 36 characters (default)
        Write(guid, "B"); // 38 characters
        Write(guid, "P"); // 38 characters
        Write(guid, "X"); // 68 characters
    }    
    
    private void Write(Guid guid, string format) 
    {
        var guidString = guid.ToString(format);
        Console.WriteLine("{0}: {1} ({2} characters)", format, guidString, guidString.Length);
    }
    

    详见Guid.ToString方法:

    【讨论】:

      猜你喜欢
      • 2010-11-01
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多