为什么.NET GUID中有破折号?

为什么.NET GUID中有破折号? 在大多数GUID的实现中是否有破折号,还是仅仅是微软的东西?

签,

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


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

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

破折号在GUID的字符串表示中。

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

也就是说,破折号的位置在哪里与GUID是如何产生有关,但历史语义不再适用,这是有历史原因的。


在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:Pf4RLB9%kULj

参考文献:
RFC4122(有关UUID格式的ABNF描述,请参见第3页)
Wikipedia GUID UUID


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

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

对于:

(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX)

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

链接地址: http://www.djcxy.com/p/91491.html

上一篇: Why are there dashes in a .NET GUID?

下一篇: How to produce a True UUID in Java?