简要说明三种新的唯一标识符格式(UUIDv6、UUIDv7 和 UUIDv8)
UUID 是 128 位标识符,旨在生成唯一标识符,而不要求在集中位置生成。UUID 规范于 2005 年编写,并在RFC 4122中定义。该规范对行业来说相当有效。
下面是三种个新的 UUID 规范:
- UUID 版本 6 (UUIDv6) — 对 UUIDv1 中的位进行简单的重新排序,以允许将其排序为不透明的字节序列。
- UUID 版本 7 (UUIDv7) — 一种新的基于时间的 UUID 位布局,基于业界广泛使用的 Unix 纪元时间戳。
- UUID 版本 8 (UUIDv8) — 一种自由格式,其唯一要求是保持向后兼容性。
什么是 UUID?
UUID(通用唯一标识符)是可以独立生成的唯一标识符,无需中央机构或与其他方协调。随着大型现代应用程序和系统在本质上是分布式的,UUID 形状的标识符作为数据库密钥越来越受欢迎。与需要协调来保证分布式数据库中的全局唯一性的顺序整数标识符不同,UUID 消除了协调的负担,使其更适合分片数据库环境。
与顺序整数标识符相比,UUID 还具有其他优点。UUID 的不可预测性允许其公开使用,而无需泄露敏感的内部信息和统计数据。UUID 也很难猜测,它在访问控制检查的同时提供了额外的防御层,以防止不安全的直接对象引用漏洞。
UUID 的随机性和 128 位大小使得重复 UUID 的概率接近于零,这意味着我们可以将 UUID 视为实际上唯一的。然而,标准非时间排序 UUID(例如 v4)的随机性在用作主键时可能会产生数据库性能问题。
UUIDv6
UUIDv6 的预期用例是作为 UUIDv1 的直接替代品,它提供了改进的数据库局部性。如果您不需要保持与 UUIDv1 的兼容性,建议改用 UUIDv7。UUIDv6 和 UUIDv1 之间的唯一真正区别是时间戳位的顺序。
UUIDv7
这是新鼓励使用的 UUID 方法。
UUID 版本 7 (UUIDv7) 是一种按时间排序的 UUID,它在最高有效 48 位中以毫秒精度对 Unix 时间戳进行编码。与所有 UUID 格式一样,6 位用于指示 UUID 版本和变体。其余 74 位是随机生成的。由于 UUIDv7 是按时间排序的,因此生成的值实际上是连续的,因此消除了索引局部性问题。
与随机前缀的 UUIDv4 相比,UUIDv7 的时间顺序性质可带来更好的数据库性能。
这篇文章对随机 UUID 与顺序 UUID 进行了基准测试,不仅显示了写入性能的改进,而且还显示了读取性能的改进。
UUIDv8
我将 UUIDv8 视为 UUIDv4 的兄弟。UUIDv8 和 UUIDv4 都仅指定版本和变体位位于正确的位置。不同的是,UUIDv4指定剩余的122位是伪随机生成的。UUIDv8 建议生成的值仍然是基于时间的,但是生成如何发生的实现细节取决于实现者。这意味着我们有 48 位自定义实现、4 位用于版本 (1000)、12 位自定义实现、2 位用于变体,最后是实现认为合适的 62 位。这给实现者留下了很大的空间,但它有足够的规则,可以在现有的 UUID 环境中共存。