雪花算法生成id

简介: 雪花算法生成id


首先雪花算法是一种分布式唯一ID生成算法,它能够在分布式系统中生成全局唯一的ID。雪花算法的特点是简单、高效,且生成的ID呈趋势递增,适用于分布式系统中需要唯一ID的场景。以下是雪花算法的原理和实现细节,用Java语言描述。

雪花算法原理:

  1. 时间戳(41位): 使用41位来表示当前时间戳,精确到毫秒级。这可以支持约69年的时间范围,但需要注意的是,由于使用的是毫秒级别的时间戳,系统时钟同步是很关键的。
  2. 机器标识(10位): 用来标识不同的机器。10位的机器标识可以支持1024台不同的机器。
  3. 序列号(12位): 如果在同一毫秒内产生多个ID,通过序列号来区分。12位的序列号可以支持每台机器每毫秒产生4096个ID。

雪花算法生成ID的步骤:

  1. 获取当前时间戳,精确到毫秒。
  2. 将获取到的时间戳左移22位,空出10位来存放机器标识。
  3. 获取机器标识,将其左移12位,空出12位来存放序列号。
  4. 获取序列号,如果在当前毫秒内已经产生了4096个ID,则等待下一毫秒再生成。
  5. 将时间戳、机器标识和序列号进行位运算,得到最终的64位ID。

下面是用Java语言实现

public class SnowflakeIdGenerator {
    // 起始的时间戳
    private static final long START_TIMESTAMP = 1617264000000L; // 2021-04-01 00:00:00
    // 机器标识位数
    private static final long WORKER_ID_BITS = 10L;
    // 序列号位数
    private static final long SEQUENCE_BITS = 12L;
    // 最大机器标识
    private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);
    // 最大序列号
    private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BITS);
    // 机器标识左移位数
    private static final long WORKER_ID_SHIFT = SEQUENCE_BITS;
    // 时间戳左移位数
    private static final long TIMESTAMP_SHIFT = WORKER_ID_BITS + SEQUENCE_BITS;
    // 上次生成ID时的时间戳
    private long lastTimestamp = -1L;
    // 当前毫秒内的序列号
    private long sequence = 0L;
    // 当前机器标识
    private final long workerId;
    public SnowflakeIdGenerator(long workerId) {
        if (workerId > MAX_WORKER_ID || workerId < 0) {
            throw new IllegalArgumentException("Worker ID can't be greater than " + MAX_WORKER_ID + " or less than 0");
        }
        this.workerId = workerId;
    }
    public synchronized long nextId() {
        long timestamp = System.currentTimeMillis();
        if (timestamp < lastTimestamp) {
            throw new RuntimeException("Clock moved backwards. Refusing to generate id for " + (lastTimestamp - timestamp) + " milliseconds.");
        }
        if (lastTimestamp == timestamp) {
            sequence = (sequence + 1) & MAX_SEQUENCE;
            if (sequence == 0) {
                // 当前毫秒内的序列号用尽,等待下一毫秒
                timestamp = waitNextMillis(lastTimestamp);
            }
        } else {
            // 新的毫秒,序列号重置
            sequence = 0;
        }
        lastTimestamp = timestamp;
        return ((timestamp - START_TIMESTAMP) << TIMESTAMP_SHIFT) |
                (workerId << WORKER_ID_SHIFT) |
                sequence;
    }
    private long waitNextMillis(long lastTimestamp) {
        long timestamp = System.currentTimeMillis();
        while (timestamp <= lastTimestamp) {
            timestamp = System.currentTimeMillis();
        }
        return timestamp;
    }
    public static void main(String[] args) {
        // 示例:创建一个workerId为1的Snowflake算法ID生成器
        SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1);
        // 生成10个ID并输出
        for (int i = 0; i < 10; i++) {
            long id = idGenerator.nextId();
            System.out.println("Generated ID: " + id);
        }
    }
}

这段代码演示了如何使用Java语言实现雪花算法。每个工作节点(机器)需要有一个唯一的workerId。这个算法确保了在同一毫秒内,每个节点的序列号都是唯一的。当序列号达到最大值时(4095),会等待下一毫秒再继续生成。

相关文章
|
23天前
|
算法
雪花算法id生成器
雪花算法id生成器
58 0
|
23天前
|
存储 算法 数据库
C++ “雪花算法“原理
C++ “雪花算法“原理
|
23天前
|
缓存 算法 NoSQL
【分布式详解】一致性算法、全局唯一ID、分布式锁、分布式事务、 分布式缓存、分布式任务、分布式会话
分布式系统通过副本控制协议,使得从系统外部读取系统内部各个副本的数据在一定的约束条件下相同,称之为副本一致性(consistency)。副本一致性是针对分布式系统而言的,不是针对某一个副本而言。强一致性(strong consistency):任何时刻任何用户或节点都可以读到最近一次成功更新的副本数据。强一致性是程度最高的一致性要求,也是实践中最难以实现的一致性。单调一致性(monotonic consistency):任何时刻,任何用户一旦读到某个数据在某次更新后的值,这个用户不会再读到比这个值更旧的值。
452 0
|
16天前
|
XML 存储 缓存
记一次雪花算法遇到的 生产事故!
最近生产环境遇到一个问题: 现象:创建工单、订单等地方,全都创建数据失败。 初步排查:报错信息为duplicate key,意思是保存数据的时候,报主键 id 重复,而这些 id 都是由雪花算法生成的,按道理来说,雪花算法是生成分布式唯一 ID,不应该生成重复的 ID。
|
23天前
|
缓存 算法 关系型数据库
深度思考:雪花算法snowflake分布式id生成原理详解
雪花算法snowflake是一种优秀的分布式ID生成方案,其优点突出:它能生成全局唯一且递增的ID,确保了数据的一致性和准确性;同时,该算法灵活性强,可自定义各部分bit位,满足不同业务场景的需求;此外,雪花算法生成ID的速度快,效率高,能有效应对高并发场景,是分布式系统中不可或缺的组件。
172 2
深度思考:雪花算法snowflake分布式id生成原理详解
|
23天前
|
算法 数据库 索引
什么是雪花算法?啥原理?
什么是雪花算法?啥原理?
37 0
什么是雪花算法?啥原理?
|
23天前
|
算法 Java 数据中心
分布式ID生成系统之雪花算法详解
在当今的云计算和微服务架构盛行的时代,分布式系统已成为软件开发的重要组成部分。随着系统规模的扩大和业务的复杂化,对数据一致性和唯一性的要求也越来越高,尤其是在全局唯一标识符(ID)的生成上。因此,分布式ID生成系统应运而生,成为保证数据唯一性和提高系统可扩展性的关键技术之一。雪花算法(Snowflake)是Twitter开源的一种算法,用于生成64位的全局唯一ID,非常适用于分布式系统中生成唯一标识符。下面我们将深入探讨雪花算法的原理、结构和实现方式。
134 2
 分布式ID生成系统之雪花算法详解
|
23天前
|
算法
雪花算法id生成util
雪花算法id生成util
26 0
|
23天前
|
存储 算法 NoSQL
细说雪花算法
细说雪花算法
|
23天前
|
算法
雪花算法id生成器
雪花算法id生成器
86 0