unit-testing – UUID版本5的测试向量(将hash转换为guid)生成算法?

我正在尝试找一些测试向量来检查我的
RFC 4122 of UUID version 5的实现.

4.3 Algorithm for Creating a Name-Based UUID

UUID的版本3用于将MD5哈希放入GUID.

UUID的第5版用于将SHA1哈希放入GUID.

RFC在C中有示例实现:

void uuid_create_sha1_from_name(
   uuid_t *uuid,         /* resulting UUID */
   uuid_t nsid,          /* UUID of the namespace */
   void *name,           /* the name from which to generate a UUID */
   int namelen           /* the length of the name */
);

我用我正在使用的语言编写了自己的实现.考虑到endian与网络秩序引起的头痛问题,我确信我的实现是错误的.

我想要一些样本数据,例如:

uuid = NameToGUID(
      {6ba7b811-9dad-11d1-80b4-00c04fd430c8}, //Namespace_URL
      "https://stackoverflow.com/questions/5515880"); //a url
CheckEquals(
      {8ABAD867-F515-3CF6-BB62-5F0C88B3BB11}, //expected uuid
      uuid);

也可以看看

> How to Create Deterministic Guids

最佳答案
german Wikipedia entry for UUIDs为www.example.org举了一个例子:

6ba7b810-9dad-11d1-80b4-00c04fd430c8 // namespace UUID
www.example.org                      // url
74738ff5-5367-5958-9aee-98fffdcd1876 // expected UUID

除此之外,Java提供了一个可用于生成测试数据的UUID class. (编辑:这似乎只能生成版本1,2,3和4 UUID.)

您链接的问题中有an answer提到了一些可以生成3/5版UUID的库:

There seem to be a few libraries out
there for generating version 3/5
UUIDs, including the 07003
module, 07004 (C++) and 07005
UUID. (I haven’t looked for any .net
ones)

OP编辑

DE维基百科上的例子有一个小错误:

>它声称使用的是DNS名称www.example.org
>给定的ASCII字节序列适用于www.example.com
>但SHA1哈希使用的是www.example.org.

i would edit the page to change the byte sequence from
0x63 0x6f 0x6d “com”
to
0x6f 0x72 0x67 “org”

but i don’t speak german, don’t want to create an account, and am just all around too lazy

这个例子归结为

Namespace_DNS: {6ba7b810-9dad-11d1-80b4-00c04fd430c8}
Name:          "www.example.org"

连接字节序列:

Bytes:         6b a7 b8 10 9d ad 11 d1 80 b4 00 c0 4f d4 30 c8   {6ba7b810-9dad-11d1-80b4-00c04fd430c8}
               77 77 77 2e 65 78 61 6d 70 6c 65 2e 6f 72 67      "www.example.org"

使用SHA1散列字节序列,并将其大部分直接复制到UUID中:

SHA1 Digest:   74738ff5 5367 e958 9aee98fffdcd187694028007
UUID (v5):     74738ff5-5367-5958-9aee-98fffdcd1876
                             ^    ^

并注意将其中一个半字节转换为5(表示版本5).
并且另一个字节的前2位设置为二进制10xxxxxx.

点赞