v5 UUID。命名空间的UUID和名称之间有什么区别

时间:2013-01-30 18:42:24

标签: c uuid

我试图通过引用函数(http://www.ietf.org/rfc/rfc4122.txt)来生成v5 UUID:

/* uuid_create_sha1_from_name -- create a version 5 (SHA-1) UUID
   using a "name" from a "name space" */
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 */
);

我已经阅读了帮助,但我仍然不清楚上述函数的第二个(uuid_t nsid)和第三个(void *name)参数之间有什么区别?

有人可以通过一个例子向我解释上述内容吗?

我还想了解RFC4122链接中的含义是什么,它对第二个参数有什么意义?

/* Name string is a URL */
uuid_t NameSpace_URL = { /* 6ba7b811-9dad-11d1-80b4-00c04fd430c8 */
    0x6ba7b811,
    0x9dad,
    0x11d1,
    0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
};

2 个答案:

答案 0 :(得分:4)

name是你为你生成的任何东西所特有的关键

namespace是一个常量UUID,用于标识您生成UUID的上下文

如果您查看RFC,您将看到第4.3节定义了名称为UUID的这些特征:

  • UUID在不同时间从同一名称生成   相同的名称空间必须相等。
  • UUID由同一名称空间中的两个不同名称生成   应该是不同的(很有可能)。
  • 在两个不同的命名空间中使用相同名称生成的UUID   应该是(非常高的概率)。
  • 如果从名称生成的两个UUID相等,那么它们就是   是在同一名称空间中使用相同的名称生成的(非常   高概率)。

这些都是基于名称的UUID中的重要属性。例如,假设您和我正在为各自的公司实施人力资源系统。这些系统彼此完全无关,但由于UUID非常棒,我们都使用基于名称的UUID来识别员工。因为这是一个相当明显的事情,我们使用员工名称作为生成UUID的name

如果没有命名空间,我们都会为名为“John Smith”的人创建相同的UUID ......但是由于我们的系统不相关而且我们正在处理不同的John Smiths,所以它们是Bad(tm)。 “那又怎么样,”你说! ......但是当我们的公司明年合并并且我们必须合并我们的人力资源数据库时会发生什么?那么,在那时我们发现自己合并了具有相同ID的数据库记录,很快公司的每个John Smith的薪水都在邮寄中,人力资源部门正在向我们递交粉红单。

为防止此类事件发生,RFC指定我们各自独立choose a UUID作为我们的namespace。命名空间通常是固定的,并与生成UUID的特定系统相关联,因此我们可能只是将其硬编码为某个配置文件中的常量。因此,在我的命名空间(例如87c9cdf7-101d-4c05-a89d-c7aaff3a3fcf)中,我可以相信我为John Smith生成的UUID将始终相同。但我也可以指望它与您创建的任何UUID不同,因为您将使用不同的命名空间。因此,如果/当我们的系统合并时,就不存在任何问题。

答案 1 :(得分:1)

从RFC的section 4.3引用,有以下步骤:

  

分配一个UUID,用作从该名称空间中的名称生成的所有UUID的“名称空间ID”;有关预定义的值,请参阅Appendix C

据我所知,此命名空间的目的是确保使用具有相同含义的相同名称将导致相同的UUID,而使用具有不同含义的相同名称将导致不同的UUID。命名空间UUID与实际名称连接在一起,并且两者都被一起散列。

有关6ba7b811-9dad-11d1-80b4-00c04fd430c8 UUID的代码段来自C部分。因此,当您将其用作命名空间时,应使用URL作为名称。例如,您将该函数称为

uuid_t result_uuid;
const char* url = "http://www.example.com/document.txt";
uuid_create_sha1_from_name(&result_uuid, NameSpace_URL, url, strlen(url));

与此相反,将使用

创建整个example.com域的UUID
uuid_t result_uuid;
const char* domain = "example.com";
uuid_create_sha1_from_name(&result_uuid, NameSpace_DNS, domain, strlen(domain));