ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

UUIDv1秒变v6的位运算魔法:uuid-creator TimeOrderedCodec源码剖析

UUIDv1秒变v6的位运算魔法:uuid-creator TimeOrderedCodec源码剖析 UUIDv1秒变v6的位运算魔法uuid-creator TimeOrderedCodec源码剖析【免费下载链接】uuid-creatorUUID Creator is a Java library for generating Universally Unique Identifiers. It generates all standard identifiers from UUIDv1 to UUIDv7. It also provides an alternative to the classic JDKs UUID (alt.GUID), many codecs (codec.*) and several utilities (util.*).项目地址: https://gitcode.com/gh_mirrors/uu/uuid-creatoruuid-creator 是一个开源 Java 库可生成 UUIDv1 到 UUIDv7 全部标准标识符。本文带你剖析它的 TimeOrderedCodec 源码——仅凭几行位运算就能把老式 UUIDv1 秒变时间可排序的 UUIDv6无需任何字符串拼接或第三方依赖。为什么要把 UUIDv1 转成 UUIDv6先搞清楚痛点。UUIDv1 的时间戳被打散存放在三个互不相邻的字段里time_low、time_mid、time_high导致按字符串排序时先后生成的 ID 在字典序上是乱序的。这对数据库很不友好B 树写入碎片化主键随机散落页分裂频繁写入性能差范围查询低效想按时间取最近 100 条索引帮不上忙缓存命中率低新记录无法追加在索引末尾而 UUIDv6 的魔法在于把 60 位时间戳重排成一个连续的大端整数字符串字典序 ≈ 时间先后序。这正是 TimeOrderedCodec 要完成的唯一任务。核心原理v1 与 v6 的位布局对比UUID 的 128 位分为高 64 位msb和低 64 位lsb。TimeOrderedCodec 只动 msblsb时钟序列 48 位节点 ID原样保留位段msb 64位UUIDv1 布局UUIDv6 布局bit 63~48time_high12位time_high12位bit 47~32time_mid16位time_mid16位bit 31~16time_low16位time_mid 续… version time_low 高位bit 15~12version 0001version 0110bit 11~0time_low 低12位… time_high 高位time_low 低12位一句话总结转换逻辑v1 → v6把打散的时间戳重新拼成连续整数版本号从 1 改成 6。v6 → v1原路拆散回三个字段版本号改回 1。源码剖析3 个十六进制常数就是全部魔法源码文件位于src/main/java/com/github/f4b6a3/uuid/codec/other/TimeOrderedCodec.java整个类不到 100 行。正向转换v1 秒变 v6encode方法的核心只有 4 行约第 62~70 行long timestamp UuidUtil.getTimestamp(uuid); long msb ((timestamp 0x0ffffffffffff000L) 4) // | (timestamp 0x0000000000000fffL) // | 0x0000000000006000L; // set version 6 long lsb uuid.getLeastSignificantBits(); return new UUID(msb, lsb);逐行拆解这 3 个魔数timestamp 0x0ffffffffffff000L—— 取 60 位时间戳的高 52 位砍掉最低 12 位 4—— 整体左移 4 位把版本号的 4 个坑位腾出来| (timestamp 0xfff)—— 把刚才砍掉的低 12 位补到最末尾| 0x6000—— 在 bit 15~12 写入0110宣告我是 UUIDv6妙处在于左移 低位补回等于把 60 位时间戳无损地折叠成一个大端排列——高位在前、低位在后字典序排序即时间排序。全程没有任何循环和字符串操作纯位运算纳秒级完成。注意时间戳不是直接读出来的而是委托给src/main/java/com/github/f4b6a3/uuid/util/UuidUtil.java中的getTimestamp()约第 272 行它会按 UUID 版本选择正确的拆位策略。反向转换v6 还原 v1decode方法约第 81~102 行就是把折叠的动作原样展开long timeHigh (timestamp 0x0fff_0000_00000000L) 48; // 拆出 12 位高位 long timeMid (timestamp 0x0000_ffff_00000000L) 16; // 拆出 16 位中段 long timeLow (timestamp 0x0000_0000_ffffffffL) 32; // 拆出 32 位低位 long version 0x0000000000001000L; // Set version 1每个掩码 移位组合把 v6 连续时间戳中对应的字段搬回 v1 的原始位置最后或上0x1000把版本号改回 1。由于 encode/decode 是严格互逆的往返转换零信息损失。动手实践一行代码完成转换// v1 → v6 UUID uuid1 UuidCreator.getTimeBased(); UUID uuid6 new TimeOrderedCodec().encode(uuid1); // v6 → v1可无限往返 UUID back new TimeOrderedCodec().decode(uuid6);类中还提供了单例TimeOrderedCodec.INSTANCE生产环境推荐复用它避免重复 new。如果不想手动转换也可以直接用门面 APIUuidCreator.getTimeOrdered()一步生成 v6底层工厂在src/main/java/com/github/f4b6a3/uuid/factory/standard/TimeOrderedFactory.java。测试怎么保证正确配套的src/test/java/com/github/f4b6a3/uuid/codec/other/TimeOrderedCodecTest.java用 100 次循环做了三重断言测试点验证目标isTimeOrdered(uuid6)产物确实是合法的 v6时间戳相等转换不丢时间精度decode(encode(v1)) v1往返转换完全可逆总结TimeOrderedCodec 用3 个掩码 移位 或运算完成了 v1 与 v6 的互转是位运算在 ID 设计中的教科书级应用核心收益ID 天然按时间有序显著提升 B 树数据库的写入与范围查询性能源码仅 ~100 行且依赖极简非常适合通读学习——建议结合UuidUtil的getTimestamp一起看掌握这 4 行核心代码后你甚至可以在任何语言里复现这套时间有序化技巧。【免费下载链接】uuid-creatorUUID Creator is a Java library for generating Universally Unique Identifiers. It generates all standard identifiers from UUIDv1 to UUIDv7. It also provides an alternative to the classic JDKs UUID (alt.GUID), many codecs (codec.*) and several utilities (util.*).项目地址: https://gitcode.com/gh_mirrors/uu/uuid-creator创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表