有没有办法找出GUID是基于名称的UUID还是基于非命名的UUID?

时间:2018-02-07 16:22:04

标签: c# uuid guid

我看到我可以创建基于名称的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

1 个答案:

答案 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变体的当前定义版本:

     
      
  1. 本文档中指定的基于时间的版本。
  2.   
  3. DCE安全版,带有嵌入式POSIX UID。
  4.   
  5. 本文档中指定的使用 MD5 散列的基于名称的版本。
  6.   
  7. 本文档中指定的随机或伪随机生成的版本。
  8.   
  9. 本文档中指定的使用 SHA-1 散列的基于名称的版本。
  10.   

使用以下代码,您可以检查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;
}