为什么.NET GUID中有破折号?在大多数GUID的实现中是否有破折号,还是仅仅是微软的东西?
签,
741ecf77-9c92-4435-8e6b-85975bd13452
发布于 2018-03-12 13:16:02
从技术上讲,GUID中没有“破折号”。GUID是一个128位的值,通常以下面的方式存储(这里使用C#来表示结构):
public struct Guid
{
public ulong Data1;
public ushort Data2;
public ushort Data3;
public fixed byte Data4[8];
}
破折号在GUID 的字符串表示中。
破折号是可选的,在GUID的字符串表示中不需要。
也就是说,破折号的位置在哪里与GUID是如何产生有关,但历史语义不再适用,这是有历史原因的。
发布于 2018-03-12 14:04:17
在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页)
https://stackoverflow.com/questions/-100003184
复制相似问题