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

问题描述 投票:49回答:13

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

签,

741英尺

.net guid uuid
13个回答
57
投票

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

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

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

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

也就是说,there are historical reasons as to where the placement of the dashes are与GUID的生成方式有关,但历史语义不再适用。


1
投票

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


0
投票

如果你想在某个地方存储一个guid,那么将它存储为一个16字节的数组,而不是它的文本表示。您将节省大量空间,并且不会出现连字符的问题。


0
投票

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


0
投票

对于价值的独特性或随机性,这些大肆宣传没有任何影响。它们仅仅是对GUID定义的延续,并在视觉上将构成GUID的四个不同数据部分分开。


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页) 维基百科GUID UUID


13
投票

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

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

对于:

(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX)

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


11
投票

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

假设你正在使用c#:

Guid guid = Guid.NewGuid();

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

63 Btfahi 4行4 V 058022然后492077

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

63 BATHFI-4 STEP-4 FALL5-8022-9

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

{63 Btfahi-4 steps-4 055-8022-9 Ffkhtsf 492077}

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

(63 Petafi-4 steps-4F05-8022-9 Ff 492077)


9
投票

这只是一个方便。

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


6
投票

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

Here is a good Wikipedia article about it.


4
投票

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


3
投票

.NET的Guid类识别一堆不同的格式:破折号作为分隔符,没有分隔符,括号作为分隔符,括号作为分隔符,没有分隔符等等


2
投票

连字符用于分隔每个数字

SAA 416SH-9377-4A 1D-8903-7

Hex digits  Description
8           Data1
4           Data2
4           Data3
4           Initial two bytes from Data4
12          Remaining six bytes from Data4
© www.soinside.com 2019 - 2024. All rights reserved.