为什么.NET GUID中有破折号?在GUID的大多数实现中是否存在破折号,或者它只是Microsoft的东西?
签名,
741ecf77-9c92-4435-8e6b-85975bd13452
答案 0 :(得分: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 :(得分:35)
在UUID(通用唯一标识符)规范的初始版本中,每个数据元素都具有语义含义:
{ time_low } - { time_mid } - { time_high_and_version } - { clock_seq_and_reserved clock_seq_low } - {< strong> 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
答案 2 :(得分:13)
Hyphens表示Guid的字节结构。
typedef struct _GUID
{
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
} GUID;
有关:
(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX)
您可以在保存之前剥离它们。至少在.NET中,Guid类型的构造函数将从其字符串表示初始化Guid变量,无论连字符是否仍然存在或被删除。
答案 3 :(得分:11)
你可以用各种格式获取你的指南。
假设你正在使用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)
答案 4 :(得分:9)
这只是一种便利。
答案 5 :(得分:6)
这是分组的一个例子,就像电话号码,信用卡号等一样。
答案 6 :(得分:4)
几乎我见过的guid的每个视觉表示都使用了虚线格式。这对眼睛来说要容易得多。
答案 7 :(得分:3)
.NET的Guid
类识别一堆不同的格式:破折号为分隔符,没有分隔符,括号为分隔符,括号为分隔符,无分隔符等等
答案 8 :(得分:2)
连字符用于分隔每个数字
E93416C5-9377-4A1D-8390-7E57D439C9E7
Hex digits Description
8 Data1
4 Data2
4 Data3
4 Initial two bytes from Data4
12 Remaining six bytes from Data4
答案 9 :(得分:1)
这只是为了方便。 GUID由16个字节组成,以十六进制文本表示形式组成32个字符。没有连字符GUID很难被人类察觉,更难被识别为GUID而不是一些随机性的16字节数字。
答案 10 :(得分:0)
如果你想在某处存储一个guid,那么将它存储为一个16字节的数组,而不是它的文本表示。您将节省大量空间,并且不会出现连字符的问题。
答案 11 :(得分:0)
GUID实际上只是一个数字。连字符显示各种组件是如何分解但实际上不是数字的一部分。它就像一个IP地址 - 你可以存储一个32位的数字,或者你可以存储一个带点的字符串,它们是等价的。
答案 12 :(得分:0)
超值对价值的独特性或随机性绝对没有影响。它们只是GUID定义的延续,并在视觉上将构成GUID的四个不同数据部分分开。