23 雪花算法生成分布式ID,这个Java工具类8个方法还能反解

发布时间:2026/10/22 17:39:34
23 雪花算法生成分布式ID,这个Java工具类8个方法还能反解 目录一、工具类功能二、所需环境三、方法与调用示例按需调用四、工具类源码可直接复制一、工具类功能生成 64 位 long 型全局唯一 ID 当数据库主键、订单号或流水号不依赖数据库自增单机每毫秒最多 4096 个不重复 ID拿到 ID 还能反解回生成时刻、机房与机器。二、所需环境JDK 17或以上三、方法与调用示例按需调用方法序号1方法用途按节点建一个雪花 ID 生成器把这台机器的 workerId 与 datacenterId 定下来集群部署时每个节点一个实例、机器位互不相同才能保证各节点产出的 ID 不撞方法定义public SnowflakeIdUtils(long workerId, long datacenterId)️入参解释public SnowflakeIdUtils(工作机器 ID, 数据中心 ID)返回值解释SnowflakeIdUtils绑定在这组机器位上的生成器实例边界口径两个机器位取值都是[0, 31]各占 5 位越界抛IllegalArgumentException并写明是哪个参数、越界到几机器位编进 ID 的固定字段事后可以用方法6、方法7 反解出来核对部署拓扑同一台机器重复建实例没问题但两条实例共用同样的机器位时不要同时发号方法示例new SnowflakeIdUtils(11, 23)之后next()反解拿到worker11、datacenter23new SnowflakeIdUtils(31, 31)是允许的边界值反解拿到worker31 datacenter31new SnowflakeIdUtils(32, 0)抛IllegalArgumentException: workerId 超出范围 [0,31]: 32new SnowflakeIdUtils(0, -1)抛IllegalArgumentException: datacenterId 超出范围 [0,31]: -1方法序号2方法用途在这个实例上取下一个 IDlong 型、趋势递增可直接当主键需要给自己的节点独立发号或用独立机器位时用实例方法而不是静态入口方法定义public synchronized long next()️入参解释public synchronized long next()返回值解释long64 位雪花 ID符号位恒为 0所以是正数边界口径同一实例连续生成的 ID 严格递增方法上有synchronized多线程共用一个实例也不会拿到重复值同一毫秒最多 4096 个序列用完就等下一毫秒再发不会发重复时钟回拨超过 5 毫秒抛IllegalStateException5 毫秒以内最多重试 3 次等时钟追平追不平同样抛IllegalStateException相对纪元的时间戳差值超出 41 位可表示范围约 69 年也抛IllegalStateException不会静默溢出成负数方法示例new SnowflakeIdUtils(1, 1).next()连续调用 10001 次每次都比上一次大拿到truenew SnowflakeIdUtils(1, 1)连取 4096 个 ID落在 3 个毫秒里、耗时 2 毫秒序列没有重复两个不同机器位的实例各取 2000 个4000 次调用得到4000 个不重复共 4000 次调用8 个线程共用默认单例各取 2000 个16000 次调用得到16000 个不重复 ID异常线程 0方法序号3方法用途用默认单例直接取一个雪花 ID单机或没打算管机器位时的最省事入口一行拿到 18 位左右的正 long订单号、流水号、消息 ID 都能用方法定义public static long nextId()️入参解释public static long nextId()返回值解释long64 位雪花 ID边界口径默认单例的两个机器位都是 0多节点部署必须改用方法1 建实例并分配互不相同的机器位口径与next()完全一致严格递增、同毫秒 4096 个上限、时钟回拨保护ID 整体趋势递增但不是连续号段别拿它算「有多少条记录」方法示例nextId()拿到像368246845022928896这样的 18 位数字nextId() 0拿到true生成的 ID 始终是正数nextId() 63拿到0符号位这一位恒空默认单例的机器位反解拿到worker0 datacenter0方法序号4方法用途取同一个雪花 ID 的字符串形式直接塞进 JSON、URL 参数或消息体省掉String.valueOf(...)也避免前端把 long 当 double 精度截断方法定义public static String nextIdStr()️入参解释public static String nextIdStr()返回值解释String十进制字符串形式的 ID边界口径就是方法3 的long转成字符串机器位仍是默认的 0/0字符串长度随时间戳增长当前是 18 位JS 侧Number只能精确表示 2 的 53 次方以内所以走字符串通道更安全方法示例nextIdStr()拿到像368246845043900416这样的串nextIdStr().length()拿到18位方法序号5方法用途从一个 ID 反解出它生成时刻的毫秒时间戳对账、排查重复 ID、按时间排序回溯问题时不用再自己算位移和纪元差方法定义public static long extractTimestamp(long id)️入参解释public static long extractTimestamp(雪花 ID)返回值解释long毫秒时间戳可以直接喂给Instant.ofEpochMilli边界口径结果是绝对毫秒已加回内部纪元拿它减一下System.currentTimeMillis()能看出这条 ID 有多旧反解是纯位移运算不会抛异常传进来的数不是真 ID 也照样给个数同一毫秒内的先后顺序看不出来要靠方法8 的序列号区分方法示例extractTimestamp(id)之后转成LocalDateTime拿到2026-10-13T12:01:29.575与当下相差 0 毫秒Math.abs(extractTimestamp(nextId()) - System.currentTimeMillis())拿到0说明它就是这一毫秒发的方法序号6方法用途从 ID 里反解出数据中心 ID定位这条数据出自哪个机房跨机房排障、核对配置中心有没有把机器位分配重复都靠它验证方法定义public static long extractDatacenterId(long id)️入参解释public static long extractDatacenterId(雪花 ID)返回值解释long数据中心 ID取值 0 到 31边界口径还原的是构造时传进去的那个值取 31 时反解也是 31默认单例发出来的 ID 反解恒为 0只看这 5 位不做合法性判断越界的输入会得到一个 0 到 31 之间的数而不是报错方法示例用new SnowflakeIdUtils(11, 23)发的 IDextractDatacenterId(id)拿到23默认单例发的 IDextractDatacenterId(id)拿到0方法序号7方法用途从 ID 里反解出工作机器 ID定位这条数据出自哪台机器有节点报告重复号段时用它把嫌疑节点筛出来方法定义public static long extractWorkerId(long id)️入参解释public static long extractWorkerId(雪花 ID)返回值解释long工作机器 ID取值 0 到 31边界口径与方法6 一样是纯位移还原取 31 的边界值也能原样解回默认单例发出来的 ID 反解恒为 0集群里如果解出两个节点同为 0就是配置没分对它只还原机器位不判断这个 ID 是不是本机发的方法示例用new SnowflakeIdUtils(11, 23)发的 IDextractWorkerId(id)拿到11new SnowflakeIdUtils(31, 31)发的 IDextractWorkerId(id)拿到31默认单例发的 IDextractWorkerId(id)拿到0方法序号8方法用途从 ID 里反解出同一毫秒内的序列号看它是这一毫秒的第几个号判断两条相邻 ID 是不是同毫秒连发、以及有没有把 4096 个序列用完用它最直接方法定义public static long extractSequence(long id)️入参解释public static long extractSequence(雪花 ID)返回值解释long序列号取值 0 到 4095边界口径同一毫秒内从 0 开始自增到 4095 后用尽生成器会等下一毫秒再发序列回到 0 附近与方法5 配合就能还原出「哪台机器、哪一毫秒、第几个号」序列只有 12 位别把它当成业务量统计口径方法示例extractSequence(id)对同一个实例连取 4096 个 ID序列去重拿到2522个因为已经跨到 3 个毫秒新建实例第一个号的extractSequence(id)拿到0序列从 0 起排紧接着第二个号的extractSequence(id)拿到1四、工具类源码可直接复制本工具类源码23-雪花算法分布式ID生成工具类 需要「Java企业级工具类全家桶1-100」点点关注点点赞回复「java工具类」可领取100个工具类的完整源码 工具类已调试通过复制粘贴即可使用省时省力 可保存到自己网盘永久有效觉得对您有帮助麻烦点点关注啦您的关注是我创作的最大动力~

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询