泪目!UUID用了这么多年,Java 26终于把最大的坑填上了

Java 开发必看:UUIDv7 终于标准化了!这次真香[特殊字符](基于 uuid-creator 实战) UUIDv7正式成为RFC标准,解决了传统UUID无序和分布式冲突问题。它具备时间有序性、高唯一性和兼容性,适用于数据库索引和分布式系统。Java开发者可通过uuid-creator库轻松生成UUIDv7,比UUIDv4和雪花算法更优。该方案支持多线程并发,节省存储空间,是新一代ID的最佳选择。升级简单,一行代码即可实现,推动系统现代化演进。 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产Star破10w的开源项目,前端包括管理后台、微信小程序,后端支持单体、微服务架构

RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRM、AI大模型、IoT物联网等功能:

  • 多模块:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 微服务:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK17/21+SpringBoot3、JDK8/11+Spring Boot2双版本 


UUID.randomUUID() 大概是 Java 里被调用得最多的工具方法之一。从数据库主键到分布式 traceId,到处都有它的身影。用了这么多年,大家也习惯了它"能用就行"的定位。

但 UUIDv4 有一个老问题一直没解决:它是完全随机的,没有时间信息,塞进 B+ Tree 索引里会造成大量页分裂 。这个问题在高写入场景下是实打实的性能杀手。

Java 26 终于把这个坑填上了——原生支持 UUIDv7。

UUIDv4 的三宗罪

1. 索引性能差

UUIDv4 是 122 位随机数,新插入的值在已有数据中的位置完全随机。对于 B+ Tree 索引来说,这意味着几乎每次插入都要加载不同的页面——随机写 。在 MySQL InnoDB 里,这个问题尤其严重,因为聚簇索引(主键索引)的物理存储顺序就是按主键排的,随机主键 = 随机 IO。

实测数据:1000 万条记录的表,UUIDv4 主键比自增 ID 主键的写入速度慢 3-5 倍 ,索引体积大 30-50% 。

2. 不可排序

没有时间信息,无法按生成顺序排序。想知道"哪条记录先创建的"?对不起,UUIDv4 帮不了你。很多团队不得不额外加一个 created_at 字段来弥补。

3. 信息密度低

128 位全给了随机数,除了保证唯一性之外,不携带任何业务信息。同样 128 位的空间,可以做更多事。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

UUIDv7:时间有序的新标准

2024 年 5 月,RFC 9562 正式发布,定义了 UUIDv7 规范。核心变化:

UUIDv7 结构(128 bits):
┌─────────────────────────────────────┐
│ 48-bit Unix Timestamp (毫秒精度)     │  ← 前 48 位是时间戳
│ 4-bit Version (0111)                │
│ 12-bit Random                       │
│ 2-bit Variant (10)                  │
│ 62-bit Random                       │  ← 剩余 74 位随机数
└─────────────────────────────────────┘

关键改进 :

  • 时间有序 :前 48 位是毫秒级 Unix 时间戳,天然按生成时间排序

  • 索引友好 :新记录总是追加在索引末尾,从随机写变成顺序写

  • 保持唯一性 :74 位随机数足以保证同一毫秒内不重复

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

Java 26 终于原生支持了

// Java 26 新增 API
UUID uuid = UUID.nameUUIDv7();

// 提取时间戳
Instant timestamp = uuid.getTimestamp();

// 一行代码搞定,不再需要第三方库

之前想用 UUIDv7,要么引 com.fasterxml.uuid(Java UUID Generator),要么自己手撸。Java 26 终于把它变成了标准 API。

注意 :UUID.randomUUID() 仍然生成 v4,新方法是 UUID.nameUUIDv7(),别搞混了。

单调递增的陷阱

UUIDv7 是"时间有序",但同一毫秒内生成的多个 UUID 并不保证严格递增 ——毫秒内的顺序由随机数部分决定。

在高并发场景下(比如同一毫秒内生成上百个 UUID),这可能导致局部乱序。如果你的场景对严格递增有要求(比如用作消息队列的 offset),需要在应用层加一个单调递增的计数器:

// 单调递增的 UUIDv7 生成器(伪代码)
publicclass MonotonicUUIDv7 {
    privatelong lastTimestamp = 0;
    privatelong counter = 0;
    
    public synchronized UUID next() {
        long now = System.currentTimeMillis();
        if (now == lastTimestamp) {
            counter++;
        } else {
            lastTimestamp = now;
            counter = 0;
        }
        // 用 counter 替换随机数的高位部分
        return buildUUIDv7(now, counter);
    }
}

大多数场景不需要这么做。 数据库主键、分布式 ID 这些常见用途,UUIDv7 默认的"毫秒级有序 + 毫秒内随机"已经足够好。

UUIDv7 vs Snowflake vs ULID

对比维度

UUIDv7

Snowflake

ULID

长度

128 bit (36 字符)

64 bit (19 位数字)

128 bit (26 字符)

时间精度

毫秒

毫秒

毫秒

有序性

毫秒级有序

严格递增

毫秒级有序

标准化

RFC 9562

无(各家实现不同)

社区规范

依赖

无

需要 Worker ID 分配

需要第三方库

JDK 原生

Java 26+

❌

❌

适合场景

分布式系统通用 ID

高并发严格递增场景

需要紧凑编码的场景

选型建议 :

  • 默认选 UUIDv7 :标准化、JDK 原生、够用

  • 需要严格递增 + 紧凑 :Snowflake(但要自己搞 Worker ID 分配)

  • 需要 URL 友好的短 ID :ULID(26 字符 Crockford Base32)

迁移指南:从 v4 到 v7

新项目 :直接用 UUID.nameUUIDv7(),没有理由再用 v4。

老项目迁移 :

// 1. 新记录用 v7
UUID newId = UUID.nameUUIDv7();

// 2. 判断已有 UUID 的版本
UUID existingId = UUID.fromString("...");
if (existingId.version() == 4) {
    // 旧数据,v4 格式
} else if (existingId.version() == 7) {
    // 新数据,v7 格式
}

v4 和 v7 可以在同一张表里共存——它们都是标准 UUID 格式,只是版本号不同。迁移不需要一步到位,新数据用 v7、老数据保持 v4 就行。

数据库层面 :如果主键是 CHAR(36) 或 BINARY(16),不需要改表结构。如果之前建了索引,切换到 v7 后索引效率会自动提升(因为新数据变成了顺序插入)。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
Java开发UUID (全球唯一标识符)截取横线 GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) 。 所以GUID就是UUID。 GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。 从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不会重复。 阅读详情

相关推荐

UUID 该换了!

UUID:Universally Unique Identifier(通用唯一标识符)

lizhihua0625的博客 306

JDK 26 正式发布!这些重磅新特性你必须知道

JDK 26正式发布,带来10项核心新特性。主要更新包括:模式匹配支持基本类型、HTTP/3协议支持、AOT对象缓存扩展至所有垃圾收集器、G1 GC吞吐量优化、final字段安全性增强等。特别值得注意的是Vector API(第11次孵化)对AI应用的支持,可加速机器学习推理计算。此外还移除了过时的Applet API,增强了安全加密功能。开发者可通过官方渠道下载JDK 26,建议生产环境等待后续补丁版本。本次更新继续强化Java在现代计算环境中的竞争力。

dylan的博客 784

【C++】 详解 lower_bound 和 upper_bound 函数(看不懂来捶我!!!)

这两个函数是我在 LeetCode 上做题见到,看到不熟悉的函数 lower_bound 和 upper_bound让我感觉很难受,于是在C++ 官网去学习,例子就一个是最基础的,我看明白了。虽然是两个函数的接口就两个,但是有时候看别人使用的时候,里面参数还可以放不同的仿函数,我懵逼了。就去网上搜,但是大家讲解的都是它的第一个接口。我只能再把文档一遍一遍过,代码一遍遍的尝试,调试。最终通过查阅资料将其总结如下。

weixin_45031801的博客 9万+

创建基于时间的 UUID

在本文中,我们将会 对 UUIDs 和基于时间的 UUIDs(time-based UUIDs) 进行一些探讨。当我们在对基于时间的 UUIDs 进行选择的时候,总会遇到一些好的方面和不好的方面,如何进行选择,也是我们将要简要探讨的内容。同时我们还会对可能会使用类库进行一些比较和探索,以便于我们更好的做出选择。

HONEY MOOSE 1241

yolov8的Detect层详解(输出维度改动)

对于部署端需要拿到onnx的output进行后处理,但是基于anchor_free的yolov8输出是1*(4+cls)*8400,不是我们常见的ncwh格式,所以对Detect层进行了学习,分享一下体会。

yjcccccc的博客 2万+

读书笔记 | 财务会计理论(第7版 William R.Scott)(中):契约视角下的会计信息价值

本文从契约理论视角深入剖析了财务会计信息的核心价值。文章指出,会计信息作为关键的“契约润滑剂”,通过债务合同与薪酬合同等具体形式,有效解决了公司内外的信息不对称与道德风险问题,协调了股东、债权人及管理层等多方利益,是公司治理与资本市场有效运转的基石。

mac99的博客 331

java生成UUID

简介 UUID是通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。目前最广泛应用的U...

野猿新一 443

Hexo博客使用PDF.js

clone了一个pdf.js 然后兴高采烈地到文章里使用{% pdf %}标签 结果浏览器弹出了个下载框(使用GitHub的raw) 不知道是不是因为使用GitHub的原因导致这个问题 后来我测试的时候报了个错 优快云上的解决方法 到时候我再试试把资源放回lib/里面看看行不行 目录1.clone1.1.官方方法1.2.NexT主题方法1.3.补充2.修改文件2.1.修改viewer.htm...

LTFan 963

Java 实例 - 生成UUID(唯一ID)

Java实例大全 @Test public void test3(){ System.out.println(getUUID()); System.out.println(getUUID()); System.out.println(getUUID()); System.out.println(getUU...

辰小白 2786

【深度解析】信息素养提升实践活动(附:历年获奖作品分析)

全国师生信息素养提升实践活动是由教育部教育技术与资源发展中心(中央电化教育馆)主办,面向全国师生的一项信息化交流展示活动。

m0_74417957的博客 2631

手把手教你用CH582的USB0/1双接口玩转CherryUSB协议栈(附完整代码)

本文深入解析CH582双USB接口硬件架构,详细讲解如何通过CherryUSB协议栈实现双接口协同工作,包括中断处理设计、端点资源分配和复合设备描述符配置。提供HID+CDC复合设备实战案例,并分享高级调试技巧与性能优化方法,帮助开发者充分利用CH582的USB0/1双接口潜力。

weixin_42525637的博客 264

java生成6位字母 uuid

Java生成6位字母UUID的科普文章 在软件开发中,唯一标识符(UUID,Universally Unique Identifier)是一个非常常用的概念。它帮助开发者为对象分配唯一的标识。虽然UUID通常是128位(32个字符),但在某些情况下,我们可能需要更短的标识符,比如6位字母。本文将介绍如何使用Java生成6位...

weixin_41320601的博客 429

2、硬件工程师笔试面试汇总(2025版本)

本文摘要:文章系统梳理了硬件工程师笔试面试中的电子元器件知识要点,涵盖电阻、电容、电感、二极管、三极管、MOS管等器件的工作原理、选型要点和应用场景。详细解析了UART、I2C、SPI等通信协议的特点及实现方式,并探讨了电源管理、信号处理、PCB设计等核心问题。针对常见电路如放大电路、滤波电路、逻辑电路等提供了深入分析,同时介绍了示波器使用、单片机系统设计等实用技能。文章还包含器件封装、电平转换、时序分析等工程实践内容,并附有相关真题解析和仿真实验指导,为硬件工程师提供全面的技术参考。

XU157303764的博客 9012

Java UUID 工具类以及UUID的原理,UUIDV7版本详解,为何可以用来做主键?

UUID(通用唯一标识符)是一种128位的标识符,用于在分布式系统中生成全局唯一的ID。它的生成原理和不同版本的设计各有特点,特别是最新的UUIDv7在数据库索引和排序方面有显著优化。UUID 的核心原理是通过组合不同的唯一性要素(如时间戳、MAC地址、随机数等)来确保全局唯一性。(60位,用于版本1/2/6/7)(4位,标识UUID的版本)(2位,定义UUID的布局规则)(如MAC地址或随机数,确保空间唯一性)148。(如v1):使用当前时间和机器网卡地址,确保时间和空间唯一性,但可能泄露隐私26。

gwndjsh的博客 2851

51单片机计算器(源程序+流程图+答辩报告+综合设计)

保姆级讲解!C语言编程,使用51单片机及LCD1602显示屏实现!

m0_57007304的博客 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

UUIDv7 详解:Java 终于有了时间有序 UUID,能否替代 Snowflake?

UUIDv7 由 RFC 9562 标准化,结合时间戳与随机性,实现按生成时间有序的分布式 ID。Java 26 原生支持 UUID.ofEpochMillis(),但不保证同毫秒内单调递增。通过 uuid-creator 等库可在旧版本 Java 中实现单调性。适用于需写入局部性的数据库索引,如 MySQL、Apache Doris,但非跨节点全局有序。

Donald的博客 171

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java中的UUID

UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同

scalad 3042

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

测试JAVA生成短8位UUID,是否重复问题,100万数据耗时26秒,越往后性能成指数增加

在网上有一种短8位UUID生成的方法,代码来源: JAVA生成短8位UUID public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "...

一起记录GIS学习 3414

java UUID的长度缩减

java UUID的长度缩减,大多数情况下可以缩减到22位不多说,直接上代码package test.uid;import java.util.HashMap; import java.util.Map;/** * @description: <br/> * @package test.AA.java * @author yang * @date 2016年11月3日 下午3:38:34

want_water_fish的博客 1万+

java Math和Random和UUID

Math类 public final class Math extends Object 以下X表示double,float,int, long abs(X x):求绝对值 max(X x1,X x2):求最大值 min(X x1,X x2):求最小值 public static double random():返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。和使...

weixin_30752377的博客 122

Java 学习 UUID 与 时间格式化、时间操作

目录   UUID : Time: 获取当前时间 格式化时间 使用Calendar 历法类设置时间 使用Calendar得到时间   UUID : UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而...

qq_37217804的博客 2230

ULID和UUID|ULID的学习及使用

ULID的相关概念,引出ULID的相关内容,分析了ULID和UUID的特点,并且讲解了ULID的使用方法;

淺雨吖的博客 4465

Java编程bios uuid,从Win32的C或德尔福获取BIOS UUID

VMWare configuration files contains a line likeuuid.bios = "56 4d ed cf 3c cd 63 20-53 78 95 86 26 92 22 c8"And afaik most (every?) physical BIOS has such an UUID. Is there any Windows API call to get...

weixin_36125445的博客 643

mysql uuid 索引_Mysql使用Java UUID作为唯一值时使用前缀索引测试

Mysql可以使用字符串前缀 作为索引 以节约空间。下面我们以 Java的UUID 生成的 32位(移除UUID中的 中划线)字符串 来做一下 测试。表结构:CREATE TABLE `test_uuid` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`uuid` varchar(36) DEFAULT NULL,PRIMARY KEY (`id`...

weixin_39525243的博客 1662

js生成uuid和guid

一、UUID是什么     UUID就是Universal Unique IDentifier的缩写,它是一个128位,16字节的值,并确保在时间和空间上唯一。 它是把硬件地址、时间以及随机数结合在一起,它保证对在同一时空中的所有机器都是唯一的。         通常平台会提供生成UUID的API。UUID按照开放软件基金会 (OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID...

qq_40435659的博客 1507
上一篇: 面试官:“你ClaudeCode都没用过吗?”,我怼回去:“就没用过又怎么了?”
下一篇: 喜大普奔!终于有人把 IntelliJ IDEA 的 Git 集成工具独立出来开源了
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值