当前位置: 首页 > news >正文

对比 UUIDv1 和 UUIDv6

UUIDv6是UUIDv1的字段兼容版本,重新排序以改善数据库局部性。UUIDv6主要在使用UUIDv1的上下文中实现。不涉及遗留UUIDv1的系统应该改用UUIDv7。

与 UUIDv1 将时间戳分割成低、中、高三个部分不同,UUIDv6 改变了这一序列,使时间戳字节从最重要到最不重要存储。也就是说,给定一个如 UUIDv1 所指定的 60 位时间戳值,对于UUIDv6,首先存储前48位最重要的位,接着是4位版本(位置相同),然后是原始60位时间戳的剩余12位。

时钟序列和节点位保持在 UUIDv1 中的位置不变。

UUIDv1 和 UUIDv6 字段和位具体布局如下:

(表格顶部的两行数字用于表示位数,00,01,…,10,11,…,20,21,…,30,31)

UUIDv10                   1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           time_low                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           time_mid            |  ver  |       time_high       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|         clock_seq         |             node              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              node                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+UUIDv60                   1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           time_high                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           time_mid            |  ver  |       time_low        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|         clock_seq         |             node              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              node                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

可以看出 UUIDv6 和 UUIDv1 的主要区别在于前 32 位是 time_low 还是 time_high。那为什么要做这种调整呢?

因为在 UUIDv1 中,时间戳的部分会被分割并分布在 UUID 的不同部分,这导致了在按时间顺序插入数据库时的非顺序性。这种非顺序性会影响数据库索引的效率,因为数据库需要频繁地重新排序数据以维持索引的顺序,从而降低了插入和查询的性能。而 UUIDv6 的调整其实就是按照正常顺序将时间戳填充到 UUID 的高 64 位,但是需要注意的是因为高 64 位中 ver 的存在,导致按时间生成的 UUIDv6 的前 64 位并非有序的,真正保持时间顺序的是 UUIDv6 的前 48 位。(当我们在数据库中为 UUIDv6 创建索引时,可以使用前缀索引,取 UUID 序列的前 6 个字节,以确保插入数据库时的顺序性)

参考资料

RFC 9562

http://www.lryc.cn/news/399581.html

相关文章:

  • 记一次饱经挫折的阿里云ROS部署经历
  • 代码运行故障排除:PyCharm中的问题解决指南
  • css实现渐进中嵌套渐进的方法
  • JavaWeb后端学习
  • VUE_TypeError: Cannot convert a BigInt value to a number at Math.pow 解决方法
  • Linux下mysql数据库的导入与导出以及查看端口
  • Open3d入门 一文读懂三维点云
  • pyinstaller系列教程(一)-基础介绍
  • echarts图表:类目轴
  • SSM贫困生申请管理系统-计算机源码84308
  • [C++]——同步异步日志系统(5)
  • Qt项目:基于Qt实现的网络聊天室---TCP服务器和token验证
  • 深入理解C++构造函数
  • J025_斗地主游戏案例开发(简版)
  • 路径规划 | 飞蛾扑火算法求解二维栅格路径规划(Matlab)
  • 优化Cocos Creator 包体体积
  • TCPDump协议分析工具
  • 土壤分析仪:解密土壤之奥秘的科技先锋
  • 计算1的数量
  • Linux udp编程
  • 【开源项目】Rust开发复制文件夹目录结构工具
  • PostgreSQL的pg_dirtyread工具
  • 苹果梦碎:Vision Pro的辉煌与失落,苹果已决定暂停 Vision Pro 后续产品的研发工作
  • 推荐一款uniapp拖动验证码插件
  • 十年期国债收益率
  • 使用Go编写的持续下行测速脚本,快速消耗流量且不伤硬盘
  • 保护国外使用代理IP的安全方法
  • 18集 学习ESP32的ESP-DL深度学习教程-《MCU嵌入式AI开发笔记》
  • jmeter-beanshell学习9-放弃beanshell
  • Web 性能入门指南-1.5 创建 Web 性能优化文化的最佳实践