63

为什么 .NET GUID 中有破折号?GUID 的大多数实现中是否有破折号,或者它只是微软的东西?

签,

741ecf77-9c92-4435-8e6b-85975bd13452

4

13 回答 13

63

从技术上讲, GUID中没有“破折号” 。GUID 是一个 128 位的值,通常以以下方式存储(此处使用 C# 表示结构):

public struct Guid
{
  public ulong Data1;
  public ushort Data2;
  public ushort Data3;
  public fixed byte Data4[8];
}

破折号位于GUID的字符串表示形式中。

破折号是可选的,在 GUID 的字符串表示中不是必需的。

也就是说,破折号的位置存在历史原因,与 GUID 的生成方式有关,但该历史语义不再适用。

于 2009-01-06T16:13:24.593 回答
42

在 UUID(通用唯一标识符)规范的初始版本中,每个数据元素都有一个语义含义:

{ time_low } - { time_mid } - { time_high_and_version } - {  clock_seq_and_reserved clock_seq_low } - { node_id }

这些元素旨在提供时间(时间位)和空间(主机位)唯一性。

版本历史

由于发现 2^1024 随机位的密钥空间中发生冲突的数学概率在天文数字上是不可能的,因此出于安全和隐私原因,UUID 规范的后续版本已逐步淘汰时间和主机数据。

唯一保留任何含义的元素是版本位和保留位。

第 3 版 UUID 派生自 URI 或其他专有名称的 MD5 哈希。

版本 4 是使用随机数据生成的,目前是您在野外看到的最常见的实现。

版本 5 源自 SHA1 哈希。

存储格式

由于连字符是在 RFC 中为 UUID 的 ASCII 格式指定的,即使各个部分不再保留其原始含义,如果您需要互操作性,它们仍然是必需的。

UUID 有时也存储为 base64 或 ascii85 编码字符串,以节省空间以通过非二进制安全的传输进行传输,并且不需要遵守 RFC。

ASCII:3F2504E0-4F89-11D3-9A0C-0305E82C3301
Base64:7QDBkvCA1+B9K/U0vrQx1A
Ascii85: 5:$Hj:Pf\4RLB9%kU\Lj

参考:
RFC4122(UUID 格式的 ABNF 描述见第 3 页)
Wikipedia GUID UUID

于 2010-08-24T14:42:09.410 回答
14

您可以获得各种格式的指南。

假设您使用的是 c#:

Guid guid = Guid.NewGuid();

Console.WriteLine(guid.ToString("N"))

63be6f7e4e564f0580229f958f492077

Console.WriteLine(guid.ToString("D"))

63be6f7e-4e56-4f05-8022-9f958f492077

Console.WriteLine(guid.ToString("B"))

{63be6f7e-4e56-4f05-8022-9f958f492077}

Console.WriteLine(guid.ToString("P"))

(63be6f7e-4e56-4f05-8022-9f958f492077)

于 2010-08-24T14:21:13.583 回答
13

连字符表示 Guid 的字节结构。

typedef struct _GUID 
{  
   DWORD Data1;  
   WORD Data2;  
   WORD Data3;  
   BYTE Data4[8];
} GUID;

为了:

(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX)

您可能可以在保存之前剥离它们。至少在 .NET 中,Guid 类型的构造函数将从其字符串表示形式初始化 Guid 变量,而不管连字符是否仍然存在或已删除。

于 2010-08-24T14:16:55.997 回答
9

这只是一种方便。

http://en.wikipedia.org/wiki/GUID

于 2009-01-06T16:09:51.123 回答
6

这是一个分块的例子,就像电话号码、信用卡号码等一样。

这是一篇关于它的好维基百科文章。

于 2009-01-06T16:11:43.537 回答
4

我见过的几乎每一个 guid 的视觉表示都使用虚线格式。对眼睛来说要容易得多。

于 2009-01-06T16:11:43.990 回答
3

Guid.NET 类可以识别一堆不同的格式:破折号作为分隔符、无分隔符、括号作为分隔符、括号作为分隔符、无分隔符等

于 2009-01-06T16:33:53.367 回答
2

连字符用于分隔每个数字

E93416C5-9377-4A1D-8390-7E57D439C9E7

Hex digits  Description
8           Data1
4           Data2
4           Data3
4           Initial two bytes from Data4
12          Remaining six bytes from Data4
于 2010-08-24T14:18:43.090 回答
1

那只是为了方便。GUID 由 16 个字节组成,以十六进制文本表示形式由 32 个字符组成。没有连字符的 GUID 更难被人类感知,也更难被识别为 GUID,而不是一些随机性质的 16 字节数字。

于 2010-08-24T14:16:50.193 回答
0

如果您想在某处存储 guid,则将其存储为 16 个字节的数组,而不是其文本表示形式。您将节省大量空间,并且不会出现连字符的问题。

于 2010-08-24T14:18:05.777 回答
0

GUID 实际上只是一个数字。连字符向您展示了各种组件是如何分解的,但实际上并不是数字的一部分。它就像一个 IP 地址——你可以存储一个 32 位的数字,或者你可以存储一个带有点的字符串,它们是等价的。

于 2010-08-24T14:18:50.000 回答
0

连字符对值的唯一性或随机性绝对没有影响。它们只是 GUID 定义的保留,并在视觉上将构成 GUID 的数据的四个不同部分分开。

于 2010-08-24T14:18:51.650 回答