我看到我可以创建基于名称的UUID /确定性GUID,请参阅https://stackoverflow.com/a/5657517/7556646。
non-name-based UUID
:
System.Guid id1 = System.Guid.NewGuid()
// id1 = {780dc51b-8eb3-4d66-b76d-8ab44e1311e6} for example
named-based UUID
:
string filePath = "Test";
System.Guid id2 = GuidUtility.Create(GuidUtility.UrlNamespace, filePath);
// id2 = {64ad81d8-15e2-5110-9024-83c64dc485f9}
现在我提出以下问题:例如,在C#中是否有办法找出GUID是name-based UUID
还是non-named-based UUID
?
答案 0 :(得分:3)
一般来说,对于非基于命名的guid,第13个数字(在第二个破折号之后)将是4,对于基于命名的guid,它将是3或5。
这不是普遍适用的,但是适用于您正在使用的代码。
" 0b5415ec-657c-的 4 强> a80-9199-f7993aff3908"
" 275b74ef-e22a-的 5 强> 9d6-8b2c-4face1410f59"
版本号在RFC 4122中描述:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_low |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_mid | time_hi_and_version |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|clk_seq_hi_res | clk_seq_low | node (0-1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node (2-5) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
版本号位于时间戳的最重要的4位 (time_hi_and_version字段的第4到7位)。 下表列出了此UUID变体的当前定义版本:
- 本文档中指定的基于时间的版本。
- DCE安全版,带有嵌入式POSIX UID。
- 本文档中指定的使用 MD5 散列的基于名称的版本。
- 本文档中指定的随机或伪随机生成的版本。
- 本文档中指定的使用 SHA-1 散列的基于名称的版本。
醇>
使用以下代码,您可以检查GUID
是否基于名称:
public static bool IsNameBased(Guid id)
{
byte version = GetVersion(id);
return version == 3 || version == 5;
}
public static byte GetVersion(Guid id)
{
byte[] byte_array = id.ToByteArray();
byte version = (byte)(byte_array[7] >> 4);
return version;
}