Java 雪花算法:生成有序不重复 ID (Java 实现)


在分布式系统中,生成唯一且有序的 ID 是一个常见的需求。雪花算法(Snowflake Algorithm)是一种常用的解决方案,它能够生成全局唯一的 ID,并且这些 ID 具有有序性。本文将详细介绍雪花算法的原理和 Java 实现,帮助你在分布式系统中生成有序不重复的 ID。

一、雪花算法概述

雪花算法是一种用于生成分布式系统中全局唯一 ID 的算法。这些 ID 通常是 64 位的整数,由一系列位段组成,每个位段都有其特定的含义和作用。雪花算法的设计目标是在不依赖集中式 ID 发号服务的情况下,实现高可用性和高并发性的 ID 生成。

二、雪花算法的组成部分

一个典型的 64 位雪花 ID 通常由以下几部分组成:

  1. 时间戳:占用 41 位,记录了 ID 生成的时间,通常是相对于某个自定义的“纪元”时间的偏移量。这个时间戳保证了 ID 的唯一性和时间有序性。
  2. 机器标识:占用 10 位,用于标识生成 ID 的机器。每台机器都有一个唯一的 ID,以确保在同一系统内不同机器生成的 ID 互不冲突。
  3. 序列号:占用 12 位,用于在同一毫秒内生成多个 ID。序列号在同一毫秒内从 0 开始递增,当达到最大值后(例如 4095)会回绕到 0。如果在同一毫秒内序列号已经增长到最大值,算法将等待直到下一毫秒继续生成 ID。

三、雪花算法的实现

以下是雪花算法的 Java 实现代码:

public class SnowflakeIdWorker {
   
    /** 开始时间截 (这个用自己业务系统上线的时间) */
    private final long twepoch = 1575365018000L;

    /** 机器id所占的位数 */
    private final long workerIdBits = 10L;

    /** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */
    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);

    /** 序列在id中占的位数 */
    private final long sequenceBits = 12L;

    /** 机器ID向左移12位 */
    private final
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java皇帝

有帮助就赏点吧,博主点杯水喝喝

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值