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

hit*_*cky 4 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 */
);
Run Code Online (Sandbox Code Playgroud)

我已阅读帮助,但我仍然不清楚上述函数的第二个( 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
};
Run Code Online (Sandbox Code Playgroud)

bro*_*ofa 7

对于您为其生成 uuid 的任何事物来说,该name密钥都是唯一的

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

如果您查看 RFC,您将看到第 4.3 节定义了基于名称的 UUID 的以下特征:

  • 同一命名空间中的同名在不同时间生成的 UUID 必须相等。
  • 同一命名空间中的两个不同名称生成的 UUID 应该不同(概率非常高)。
  • 两个不同命名空间中的同名生成的 UUID 应该不同(非常高的概率)。
  • 如果从名称生成的两个 UUID 相等,则它们是从同一名称空间中的相同名称生成的(概率非常高)。

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

如果没有命名空间,我们将为任何名为“John Smith”的人创建相同的 UUID...但这会很糟糕,因为我们的系统不相关,而且我们正在处理不同的 John Smith。“那又怎么样,”你说!...但是当我们的公司明年合并并且我们必须合并我们的人力资源数据库时会发生什么?好吧,那时我们发现自己正在合并具有相同 ID 的数据库记录,很快公司中每个 John Smith 的薪水都会通过邮件发送出去,人力资源部也会向我们递交解雇通知单。

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