如何解决生成 v5 UUID什么是名称和命名空间?
名称和命名空间可用于创建(很可能)唯一 UUID 的层次结构。
粗略地说,类型 3 或类型 5 UUID 是通过将命名空间标识符与名称散列在一起生成的。第 3 类 UUID 使用 MD5,第 5 类 UUID 使用 SHA1。只有 128 位可用,其中 5 位用于指定类型,因此所有哈希位都不会进入 UUID。(MD5 也被认为是密码破解,而 SHA1 已处于最后阶段,因此不要使用它来验证需要“非常安全”的数据)。也就是说,它为您提供了一种创建可重复/可验证的“哈希”函数的方法,将可能的分层名称映射到概率上唯一的 128 位值,可能像分层哈希或 MAC 一样。
假设您有一个 (key,value) 存储,但它只支持一个命名空间。您可以使用类型 3 或类型 5 UUID
生成大量不同的逻辑命名空间。首先,为每个命名空间创建一个根 UUID。这可以是类型 1(主机+时间戳)或类型
4(随机)UUID,只要您将它存储在某处即可。或者,您可以为您的根创建 一个 随机
UUID(或使用null
UUID:00000000-0000-0000-0000-000000000000
作为根),然后使用“ uuid -v5
$ROOTUUID $NAMESPACENAME
”为每个命名空间创建一个可重现的 UUID。现在,您可以使用 “uuid -v5
$NAMESPACEUUID $KEY
”。这些 UUID 可以被扔到单个键值存储中,避免冲突的可能性很高。这个过程可以递归地重复,例如,如果与 UUID
键关联的“值”反过来代表某种逻辑“命名空间” ” 就像一个桶、容器或目录,那么它的 UUID 可以反过来用来生成更多层次的 UUID。
生成的类型 3 或类型 5 UUID 包含命名空间 id 和命名空间内名称(键)的(部分)散列。它不再保存命名空间 UUID,就像消息 MAC 保存它编码的消息的内容一样。从 uuid 算法的角度来看,名称是一个“任意”(八位字节)字符串。但是,它的含义取决于您的应用程序。它可以是逻辑目录中的文件名、对象存储中的对象 ID 等等。
虽然这适用于中等数量的命名空间和键,但如果您的目标是大量唯一且概率非常高的键,它最终会失去动力。生日问题(又名生日悖论)的 Wikipedia
条目包括一个表格,该表格给出了不同数量的键和表格大小的至少一次冲突的概率。对于 128 位,以这种方式散列 260
亿个密钥的概率为p=10^-18
(可忽略不计),但是 26
万亿个密钥,将至少发生一次冲突的概率增加到p=10^-12
(万亿分之一),而散列26*10^15
密钥,则增加了至少发生一次碰撞p=10^-6
(百万分之一)。调整编码
UUID 类型的 5 位,它会更快地用完,因此一万亿个密钥大约有万亿分之一的机会发生一次碰撞。
有关概率表,请参见http://en.wikipedia.org/wiki/Birthday_problem#Probability_table。
有关 UUID 编码的更多详细信息,请参阅http://www.ietf.org/rfc/rfc4122.txt。
解决方法
我已经阅读了该man
页面,但我不明白它的用途name
和namespace
用途。
对于版本 3 和版本 5 UUID,必须提供额外的命令行参数命名空间和名称。命名空间是字符串表示形式的 UUID 或内部预定义命名空间 UUID
的标识符(目前已知为“ns:DNS”、“ns:URL”、“ns:OID”和“ns:X500”)。名称是任意长度的字符串。
命名空间:
命名空间是字符串表示形式的 UUID 或
这是否意味着我需要将它(UUID v4)存储在与生成的 UUID v5 相关的某个地方?在任何一种情况下,为什么这不会自动完成?
名称是任意长度的字符串。
name
一个完全随机的字符串?那它的目的是什么?可以从 UUID v5 解码吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。