gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:43:57 26 4
gpt4 key购买 nike

我正在尝试通过引用函数 (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 */
);

我已经阅读了帮助,但我仍然不清楚 2nd(uuid_t nsid) 和 3rd(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
};

最佳答案

name 是您为之生成 uuid 的任何事物的唯一键

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

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

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

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

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

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

关于c - v5 UUID。命名空间的 UUID 和名称有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14611373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com