v5 UUID. 命名空间和名称的UUID有什么区别?

4

我正在尝试生成一个v5 UUID,参考的函数是(http://www.ietf.org/rfc/rfc4122.txt):

/* 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个回答

7
“name”是生成UUID的唯一键,与您要生成UUID的任何内容相关。
“namespace”是一个常量UUID,用于标识生成UUID的上下文。
如果您查看RFC,您会看到第4.3节定义了基于名称的UUID的这些特性:
- 在相同命名空间中从相同名称生成的UUID在不同时间生成的UUID必须相等。 - 在相同命名空间中从两个不同名称生成的UUID应该不同(极有可能)。 - 在两个不同命名空间中从相同名称生成的UUID应该不同(极有可能)。 - 如果从名称生成的两个UUID相等,则它们是从相同名称在相同命名空间中生成的(极有可能)。
这些都是具有基于名称的UUID的重要属性。例如,假设您和我正在为我们各自的公司实施HR系统。这些系统彼此完全无关,但由于UUID非常棒,我们都使用基于名称的UUID来识别员工。并且因为这是一个相当明显的事情,我们使用员工姓名作为生成UUID的“名称”。
没有命名空间,我们都会为名字叫“John Smith”的人创建相同的UUID...但这是不好的(商标),因为我们的系统是不相关的,我们正在处理不同的John Smiths。你会说:“那又怎样!”...但是当我们的公司明年合并时,我们必须合并我们的HR数据库,那么我们就会发现自己正在合并具有相同ID的数据库记录,很快每个公司中的John Smith的工资单就会在邮件中交错,并且HR部门会给我们发粉红色的辞职通知。
为了防止这种情况发生,RFC规定我们每个人都独立选择一个UUID作为我们的namespace。命名空间通常是固定的,并与生成UUID的特定系统相关联,因此我们可能会在某个配置文件中将其硬编码为常量。因此,在我的命名空间(例如87c9cdf7-101d-4c05-a89d-c7aaff3a3fcf)中,我可以相信我为John Smith生成的UUID始终是相同的。但我也可以相信它与您创建的任何UUID都不同,因为您将使用不同的命名空间。因此,如果/当我们的系统合并,就不会出现任何问题。

1

引用自RFC的第4.3节,有以下步骤:

为所有从该名称空间中生成的UUID分配一个UUID作为“名称空间ID”; 请参见附录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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接