一个GUID里有多少个字符?

91

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

我对包括花括号和破折号在内的Microsoft样式感兴趣。


2
它们的长度完全相同。如果你数一个字符串中的字符,你就知道所有字符串的长度。 - Greg Hewgill
8
当我谷歌这个问题时,每个答案都只是指向guid的定义。如果你想的话可以给我负评,但我只是想让这个具体问题的答案更容易被找到,未来的提问者无需再进行计数。 - Jim Counts
2
我理解你的意思,但是如果有人刚接触NewDataX,关于长度的问题是合理的,而且在你了解什么是NewDataX之前,你不能假设你所见到的代表了每一个其他的NewDataX。 - Adam Davis
我没有看到任何人提到过叫做“NewDataX”的东西。 - Oscar
4个回答

138

来自MSDN

GUID是一个128位的值,由一组8个十六进制数字、三组每组4个十六进制数字和一组12个十六进制数字组成。下面是一个示例GUID,显示了GUID中十六进制数字的分组方式:6B29FC40-CA47-1067-B31D-00DD010662DA

来自维基百科

通常在上述格式周围添加大括号,如下所示:

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

典型的十六进制编码中包含带大括号的38个字符。

-Adam


@magnifico -- 请看这个回答的最后一段:“所以在典型的十六进制编码中,总共有38个字符,包括花括号。” - Randolpho
1
不需要与Magnifico争论 - 他提出了问题,他有权决定谁给出了最相关的答案。我相信他有自己偏爱另一个答案的原因。 - Adam Davis
1
@Beska,因为这就是Stack Overflow的用途。不要只给一个人一条鱼,而是把同样的鱼分给一百万人。 - bugloaf
@bugloaf 嗯,我怀疑我的两条评论都是针对已经被删除的内容,因为它们在当前情境下没有任何意义...而第一条评论非常明确地回应了某个已经消失的东西。我已经把它们删掉了。(在当前情境下,看起来像是我在反对答案,但那是一个好答案,我这么做没有任何意义,你也正确地指出了这一点。) - Beska
@AdamDavis 我数了32个,不是38个。编辑:你可能把大括号和破折号也算进去了,没事了。 - KyleM

33

TL;DR: 无。

如Adam Davis所述,微软的风格是使用十六进制编码(带有大括号和破折号使其更易读),可以使用ASCII字符的子集(0-9和A-F)来显示,但这不是特定的ASCII编码。

我认为重要的是要记住,微软显示GUID的方式只是GUID的表示,而实际上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


4
我在这里发布了一个C#的Ascii-85编码器/解码器:https://dev59.com/cHE85IYBdhLWcg3wVR-g#4211088 - sheikhjabootie
1
如果这个答案顶部有一个大而粗的“无”来引诱读者并充当TL;DR,那就好了。 ;) - jpmc26
OP特别要求使用微软的实现。 - ryanwebjackson
@ryanwebjackson,你当然是对的,但我认为这个答案可能会使仅根据标题进入此问题的用户受益。 - Wiebe Tijsma

14

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

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


9
长度取决于编码方式。您可以使用以下代码段获取标准编码和长度:
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方法:


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