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

Sha*_*awn 50 .net uuid guid

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

签,

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

cas*_*One 58

从技术上讲,GUID中没有"破折号" .GUID是128位值,通常以下列方式存储(使用C#表示结构):

public struct Guid
{
  public ulong Data1;
  public ushort Data2;
  public ushort Data3;
  public fixed byte Data4[8];
}
Run Code Online (Sandbox Code Playgroud)

破折号位于GUID 的字符串表示中.

短划线是可选的,在GUID的字符串表示中不是必需的.

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

  • 这完全是完全错误的,在GUID的连字符ASCII十六进制表示中有5个带连字符的元素,包含二进制GUID元素的结构只有4个元素长.此外,历史语义肯定仍然适用,特别是在这个问题中,考虑到历史是首先出现连字符的确切原因. (2认同)
  • @joshperry你从答案中重申了我的观点.一个`Guid`只有128个字节,周期.分隔符来自*表示*.此外,关于在*表示*中应用的历史语义,它们不是.正如你所说,这是出于历史原因.这些历史原因不再适用.从您的回答中,"这些数据元素不再具有任何特定含义." (2认同)
  • 我不确定我在哪里重申 GUID 是 128 字节,但您的第二段(关于与结构对应的连字符)显然不准确。连字符在那里_因为_布局是在 UUID RFC 中指定的,与该结构无关。诚然,当代 UUID 中的段不一定具有它们过去的含义,但是,它们之所以存在是因为它们过去的含义。所以我猜它们现在就在那里,因为**RFC 是这么说的**,如果您想要/需要创建可互操作的 URN,那么您将遵循 RFC。 (2认同)

jos*_*rry 35

在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


小智 13

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

typedef struct _GUID 
{  
   DWORD Data1;  
   WORD Data2;  
   WORD Data3;  
   BYTE Data4[8];
} GUID;
Run Code Online (Sandbox Code Playgroud)

对于:

(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX)
Run Code Online (Sandbox Code Playgroud)

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


Nis*_*sim 11

你可以用各种格式获取你的指南.

假设你正在使用c#:

Guid guid = Guid.NewGuid();

Console.WriteLine(guid.ToString("N"))
Run Code Online (Sandbox Code Playgroud)

63be6f7e4e564f0580229f958f492077

Console.WriteLine(guid.ToString("D"))
Run Code Online (Sandbox Code Playgroud)

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

Console.WriteLine(guid.ToString("B"))
Run Code Online (Sandbox Code Playgroud)

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

Console.WriteLine(guid.ToString("P"))
Run Code Online (Sandbox Code Playgroud)

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


And*_*are 6

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

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