UUID 的 8 个版本以及何时使用它们

UUID 的 8 个版本以及何时使用它们

有哪些不同的版本?

通常,当我们有多个编号版本时,数字越大越新,并且被认为越好。相比之下,有 8 个 UUID 版本(v1 到 v8),它们各不相同,并且全部在标准中定义。

在这里,我将提供一些关于它们的高层次解释,并链接到 RFC ,以防您需要更多详细信息。

  • UUID 版本 1 (v1)由时间戳、单调计数器和 MAC 地址生成。
  • UUID 版本 2 (v2)保留用于没有已知详细信息的安全 ID。
  • UUID 版本 3 (v3)是根据您提供的某些数据的 MD5 哈希值生成的。 RFC 在候选数据中建议了 DNS 和 URL。
  • UUID 版本 4 (v4)是根据完全随机的数据生成的。这可能是大多数人对 UUID 的想法和遇到的情况
  • UUID 版本 5 (v5)是根据您提供的一些数据的 SHA1 哈希值生成的。与 v3 一样,RFC 建议使用 DNS 或 URL 作为候选。
  • UUID 版本 6 (v6)由时间戳、单调计数器和 MAC 地址生成。这些数据与版本 1 相同,但更改了顺序,以便对它们进行排序时将按创建时间排序。
  • UUID 版本 7 (v7)由时间戳和随机数据生成。
  • UUID 版本 8 (v8)完全是自定义的(除了所有版本都包含的必需版本/变体字段)。

什么时候应该使用它们?

有八个不同的版本,您应该使用哪个?有一些常见的用例决定了您应该使用哪个,其中一些已被其他用例取代。

您通常会在其中两个之间进行选择:v4 或 v7。也有一些场合选择v5或v8。

  • 当您只想要一个随机 ID 时 ,请使用 v4。这是一个很好的默认选择。
  • 如果您要在希望能够排序的上下文中使用 ID,请使用 v7。例如,如果您使用 UUID 作为数据库键,请考虑使用 v7。
  • 如果您在 UUID 中有自己想要的数据,则使用 v5 或 v8,但一般来说,您会知道是否需要它。

其他的呢?

  • 根据 RFC ,v7 在 v1 和 v6 的基础上进行了改进,如果可能的话,应该使用 v7。所以你通常不需要 v1 或 v6。如果您确实想要其中之一,可以使用 v6。
  • v2 保留用于未指定的安全事务。如果您正在使用这些,您可能无法告诉我或其他任何人,并且您可能不会阅读这篇文章来了解有关它们的更多信息。
  • v3 被 v5 取代,后者使用更强的哈希值。您可能知道是否需要它。

UUIDv7 的优点:

  • 时间可排序性:如上所述,UUIDv7 值是可时间排序的,这意味着您可以根据生成时间以升序对它们进行排序。这使得基于时间的查询更加高效和直观。
  • 精确时间戳 :从之前的草案开始,UUIDv7 的粒度高达 50 纳秒(但在编写时默认为 1 毫秒,请参阅RFC4122 草案),UUIDv7 提供出色的精度。当与随机性相结合时,这基本上保证了碰撞(即使在全球分布式系统之间!)是不可能的。
  • 全球唯一性:与其他 UUID 一样,UUIDv7 确保全球唯一性。这意味着您可以跨不同系统或节点独立生成 ID,并且它们不会发生冲突。

为什么 UUIDv7 更适合数据库:

  • 自然排序:传统数据库通常需要额外的时间戳列来根据创建时间对记录进行排序。借助 UUIDv7,您可以使用 UUID 本身实现这种排序,从而无需额外的列。
  • 优化索引:由于 UUIDv7 是可时间排序的,数据库索引机制可以更好地优化存储和检索过程,从而加快查询时间,尤其是基于时间的查询。
  • 并发和分布:在分布式系统中,生成唯一的、连续的 ID 可能是一个挑战。 UUIDv7 可以跨多个节点同时生成,没有冲突的风险,使其适合分布式架构。
  • 减少开销:与 UUIDv1 不同,UUIDv1 可以公开生成 UUID 的计算机的 MAC 地址(引发隐私问题),UUIDv7 没有这个缺点,减少了模糊或匿名化此数据的开销。
  • 灵活性:支持二进制存储的数据库可以有效地存储UUIDv7,并且如果需要,可以轻松地将它们编码为其他格式,例如字符串。

参考文章:

原文地址

# UUIDv7:现代数据库的时间可排序标识符

相关推荐
琴智冰5 分钟前
MySQL安装
mysql
桶将军T16 分钟前
SEAFARING靶场渗透
数据库·web安全
Data 31733 分钟前
经典sql题(二)求连续登录最多天数用户
大数据·数据库·数据仓库·sql·mysql
服装学院的IT男1 小时前
【Android 13源码分析】WindowContainer窗口层级-3-实例分析
android·数据库
小王是个弟弟2 小时前
HQL-计算不一样的 MUV
数据库·hive·sql
自身就是太阳2 小时前
深入理解 Spring 事务管理及其配置
java·开发语言·数据库·spring
不惑_2 小时前
初识 performance_schema:轻松掌握MySQL性能监控
数据库·mysql
Gauss松鼠会2 小时前
GaussDB关键技术原理:高弹性(四)
java·大数据·网络·数据库·分布式·gaussdb
Aries2633 小时前
Spring事务传播行为详解
java·数据库·spring
code.song3 小时前
电影评论|基于springBoot的电影评论网站设计与实现(附项目源码+论文+数据库)
数据库·spring boot·后端