为什么 .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的生成方式有关,但这种历史语义已不再适用。
Guid
只是128个字节,没有别的。分隔符来自表示。此外,在表示中适用于历史语义的内容已经不再适用。正如你所说,这是出于历史原因。那些历史原因已经不再适用。从你的回答中可以看出,“这些数据元素不再具有任何特定的含义。” - casperOneAscii: 3F2504E0-4F89-11D3-9A0C-0305E82C3301 Base64: 7QDBkvCA1+B9K/U0vrQx1A Ascii85: 5:$Hj:Pf\4RLB9%kU\Lj
您可以以多种格式获取您的 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)
连字符表示 Guid 的字节结构。
typedef struct _GUID
{
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
} GUID;
对于:
(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX)
在保存之前,您可能可以删除它们。至少在.NET中,Guid类型的构造函数将从其字符串表示形式初始化一个Guid变量,无论连字符是否存在或被删除。
Data4
中有额外的连字符? - dan04我看到的几乎所有GUID的可视化表示都使用虚线格式。这种格式更容易阅读。
.NET中的Guid
类可以识别多种格式:使用破折号作为分隔符、没有分隔符、使用方括号和圆括号作为分隔符或者没有分隔符等。
Guid
不是一个类,而是一个值类型。 - casperOne连字符用于分隔每个数字
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字节数字。