UUID 及其实现 3
这一篇来讲 v3 和 v5 的实现。
这两个实现要求使用方提供:
- 一个称为 namespace 的 UUID
- 一个叫 name 的数据块(不限于字符串)
然后利用一个 hash 算法算得结果,作为目标 UUID 的基础数据(还需要额外设置 variant 和 version)。
即,对于 v3/v5 的实现,本质上是
1 | uuid = hash(namespace, name) |
v3 和 v5 区别在于,前者是用 MD5,后者使用 SHA-1。
并且可以发现,对于相同的 namespace 和 name,生成的结果 UUID 是一样的。
这个就是 v3/v5 版本的特性。
借用 RFC 的描述就是:
- The UUIDs generated at different times from the same name in the same namespace MUST be equal.
- The UUIDs generated from two different names in the same namespace should be different (with very high probability).
- The UUIDs generated from the same name in two different namespaces should be different with (very high probability).
- If two UUIDs that were generated from names are equal, then they were generated from the same name in the same namespace (with very high probability).
所以 v3/v5 的版本又被叫做 name-based implementation