为什么.NET GUID中有破折号?在GUID的大多数实现中是否存在破折号,或者它只是Microsoft的东西?
签,
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:Pf\4RLB9%kU\Lj
参考文献:
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变量,无论连字符是否仍然存在或被删除.
你可以用各种格式获取你的指南.
假设你正在使用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)
这只是一个方便.
http://en.wikipedia.org/wiki/GUID
这是分块的一个例子,就像电话号码,信用卡号码等.
这是关于它的一篇很好的维基百科文章.