gpt4 book ai didi

uuid - 生成 v5 UUID。什么是名称和命名空间?

转载 作者:行者123 更新时间:2023-12-03 04:48:15 25 4
gpt4 key购买 nike

我已阅读 man 页面,但我不明白 namenamespace 的用途。

For version 3 and version 5 UUIDs the additional command linearguments namespace and name have to be given. The namespace is eithera UUID in string representation or anidentifier for internally pre-defined namespace UUIDs (currently known are "ns:DNS", "ns:URL", "ns:OID", and "ns:X500"). Thename is a string of arbitrary length.

命名空间:

The namespace is either a UUID in string representation or an

这是否意味着我需要将它(UUID v4)存储在与生成的 UUID v5 相关的某个位置?无论哪种情况,为什么这不自动完成?

The name is a string of arbitrary length.

name 是一个完全随机的字符串?那么它的目的是什么呢?可以从 UUID v5 解码吗?

最佳答案

类型 3 和类型 5 UUID 只是将哈希填充到 UUID 中的一种技术:

  • 类型 1:将 MAC 地址+日期时间填充为 128 位
  • 类型 3:将 MD5 哈希 填充到 128 位
  • 类型 4:将随机数据填充到 128 位
  • 类型 5:将 SHA1 哈希填充到 128 位
  • 类型 6:unofficial idea for sequential UUIDs

编辑:非官方类型 6 现在有官方 rfc

SHA1 哈希输出 160 位(20 字节);哈希结果被转换为 UUID。

使用 SHA1 的 20 字节摘要:

SHA1 Digest:   74738ff5 5367 e958 1aee 98fffdcd1876 94028007
UUID (v5): 74738ff5-5367-5958-9aee-98fffdcd1876
⭡ ⬑first two bits set to 1 and 0, respectively
╰─low nibble is set to 5, to indicate type 5

我要哈希什么?

您可能想知道我应该散列什么。基本上你散列了以下内容的串联:

sha1(NamespaceUUID+AnyString);

您可以使用所谓的命名空间作为字符串前缀,以防止名称冲突。

UUID RFC为您预先定义了四个命名空间:

  • NameSpace_DNS:{6ba7b810-9dad-11d1-80b4-00c04fd430c8}
  • NameSpace_URL:{6ba7b811-9dad-11d1-80b4-00c04fd430c8}
  • NameSpace_OID:{6ba7b812-9dad-11d1-80b4-00c04fd430c8}
  • NameSpace_X500:{6ba7b814-9dad-11d1-80b4-00c04fd430c8}

所以,你可以一起哈希:

StackOverflowDnsUUID = sha1(Namespace_DNS + "stackoverflow.com");
StackOverflowUrlUUID = sha1(Namespace_URL + "stackoverflow.com");

RFC 然后定义如何:

  • 从 SHA1 中获取 160 位
  • 并将其转换为 128 位的 UUID

基本要点是只取前 128 位,在 type 记录中填充 5,然后设置前两位clock_seq_hi_and_reserved 部分的位分别设置为 1 和 0。

更多示例

现在您已经有了一个生成所谓的 Name 的函数,您可以拥有该函数(以伪代码形式):

UUID NameToUUID(UUID NamespaceUUID, String Name)
{
//Note: All code on stackoverflow is public domain - no attribution required.

Byte[] hash = sha1(NamespaceUUID.ToBytes() + Name.ToBytes());
Uuid result;

//Copy first 16-bytes of the hash into our Uuid result
Copy(hash, result, 16);

//set high-nibble to 5 to indicate type 5
result[6] &= 0x0F;
result[6] |= 0x50;

//set upper two bits to "10"
result[8] &= 0x3F;
result[8] |= 0x80;

return result;
}

(注意:系统的字节顺序可能会影响上述字节的索引)

现在您可以调用电话了:

uuid = NameToUUID(Namespace_DNS, 'www.stackoverflow.com');
uuid = NameToUUID(Namespace_DNS, 'www.google.com');
uuid = NameToUUID(Namespace_URL, 'http://www.stackoverflow.com');
uuid = NameToUUID(Namespace_URL, 'http://www.google.com/search&q=rfc+4112');
uuid = NameToUUID(Namespace_URL, 'http://stackoverflow.com/questions/5515880/test-vectors-for-uuid-version-5-converting-hash-into-guid-algorithm');

现在回到你的问题

For version 3 and version 5 UUIDs the additional command line arguments namespace and name have to be given. The namespace is either a UUID in string representation or an identifier for internally pre-defined namespace UUIDs (currently known are "ns:DNS", "ns:URL", "ns:OID", and "ns:X500"). The name is a string of arbitrary length.

命名空间是您喜欢的任何 UUID。它可以是预定义的之一,也可以是您自己的,例如 1 :

UUID Namespace_RectalForeignExtractedObject = '8e884ace-bee4-11e4-8dfc-aa07a5b093db'

The name is a string of arbitrary length.

名称只是您想要附加到命名空间、然后进行散列并填充到 UUID 中的文本:

uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'screwdriver');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'toothbrush');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'broomstick');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'orange');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'axe handle');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'impulse body spray');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'iPod Touch');

关于uuid - 生成 v5 UUID。什么是名称和命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10867405/

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