C V5UUID。名称空间的UUID和名称之间有什么区别
我试图通过引用函数()来生成V5UUID: 我已经阅读了帮助,但我仍然不清楚上述函数的第2个(C V5UUID。名称空间的UUID和名称之间有什么区别,c,uuid,C,Uuid,我试图通过引用函数()来生成V5UUID: 我已经阅读了帮助,但我仍然不清楚上述函数的第2个(uuid\u t nsid)和第3个(void*name)参数之间的区别是什么 有人能给我举个例子解释一下吗 我还想了解以下内容在RFC4122链接中的含义,以及它对第二个参数是否有任何意义 /* Name string is a URL */ uuid_t NameSpace_URL = { /* 6ba7b811-9dad-11d1-80b4-00c04fd430c8 */ 0x6ba7b8
uuid\u t nsid
)和第3个(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
};
从RFC的报价中,有以下步骤:
分配一个UUID,用作该名称空间中名称生成的所有UUID的“名称空间ID”;有关一些预定义的值,请参见
据我所知,此名称空间的目的是确保使用具有相同含义的相同名称将产生相同的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));
名称
是为任何对象生成uuid的唯一键
名称空间
是一个常量UUID,用于标识生成UUID的上下文
如果查看RFC,您将看到第4.3节定义了名称baesed UUID的以下特征:
- 在不同时间从中的相同名称生成的UUID 同一名称空间必须相等
- 从同一命名空间中的两个不同名称生成的UUID 应该是不同的(概率非常高)
- 从两个不同名称空间中的相同名称生成的UUID 应与(非常高的概率)不同
- 如果从名称生成的两个UUID相等,则它们 从同一命名空间中的同一名称生成(具有 高概率)
名称
如果没有名称空间,我们将为任何名为“John Smith”的人创建相同的UUID。。。但这是不好的(tm),因为我们的系统是不相关的,我们正在与不同的约翰·史密斯打交道。“那又怎样,”你说。。。但是,当我们的公司明年合并,我们不得不合并我们的人力资源数据库时,会发生什么呢?嗯,到那时,我们发现自己正在合并具有相同ID的数据库记录,很快公司中每个约翰·史密斯的工资支票都在邮件中交叉,人力资源部正在给我们递上解雇通知单
为了防止这种情况发生,RFC指定我们各自独立地使用名称空间。名称空间通常是固定的,并与生成UUID的特定系统相关联,因此我们可能只是将其硬编码为某个配置文件中的常量。因此,在我的命名空间中(例如,87c9cdf7-101d-4c05-a89d-c7aaff3a3fcf
),我可以相信我为John Smith
生成的UUID将始终是相同的。但我也可以相信它与您创建的任何UUID都不同,因为您将使用不同的名称空间。因此,如果我们的系统合并,就不会有任何问题
uuid_t result_uuid;
const char* domain = "example.com";
uuid_create_sha1_from_name(&result_uuid, NameSpace_DNS, domain, strlen(domain));