为什么 .NET GUID 中有破折号?GUID 的大多数实现中是否有破折号,或者它只是微软的东西?
签,
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
您可以获得各种格式的指南。
假设您使用的是 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)
连字符表示 Guid 的字节结构。
typedef struct _GUID
{
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
} GUID;
为了:
(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX)
您可能可以在保存之前剥离它们。至少在 .NET 中,Guid 类型的构造函数将从其字符串表示形式初始化 Guid 变量,而不管连字符是否仍然存在或已删除。
这只是一种方便。
这是一个分块的例子,就像电话号码、信用卡号码等一样。
我见过的几乎每一个 guid 的视觉表示都使用虚线格式。对眼睛来说要容易得多。
Guid
.NET 类可以识别一堆不同的格式:破折号作为分隔符、无分隔符、括号作为分隔符、括号作为分隔符、无分隔符等
连字符用于分隔每个数字
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
那只是为了方便。GUID 由 16 个字节组成,以十六进制文本表示形式由 32 个字符组成。没有连字符的 GUID 更难被人类感知,也更难被识别为 GUID,而不是一些随机性质的 16 字节数字。
如果您想在某处存储 guid,则将其存储为 16 个字节的数组,而不是其文本表示形式。您将节省大量空间,并且不会出现连字符的问题。
GUID 实际上只是一个数字。连字符向您展示了各种组件是如何分解的,但实际上并不是数字的一部分。它就像一个 IP 地址——你可以存储一个 32 位的数字,或者你可以存储一个带有点的字符串,它们是等价的。
连字符对值的唯一性或随机性绝对没有影响。它们只是 GUID 定义的保留,并在视觉上将构成 GUID 的数据的四个不同部分分开。