雪花算法生成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),会等待下一毫秒再继续生成。

相关文章
|
6月前
|
算法
雪花算法id生成器
雪花算法id生成器
437 0
|
4天前
|
算法 关系型数据库 MySQL
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
在分布式系统中,确保每个节点生成的 ID 唯一且高效至关重要。Snowflake 算法由 Twitter 开发,通过 64 位 long 型数字生成全局唯一 ID,包括 1 位标识位、41 位时间戳、10 位机器 ID 和 12 位序列号。该算法具备全局唯一性、递增性、高可用性和高性能,适用于高并发场景,如电商促销时的大量订单生成。本文介绍了使用 Go 语言的 `bwmarrin/snowflake` 和 `sony/sonyflake` 库实现 Snowflake 算法的方法。
17 1
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
|
3月前
|
算法 Go
[go 面试] 雪花算法与分布式ID生成
[go 面试] 雪花算法与分布式ID生成
|
3月前
|
SQL 算法 Serverless
B端算法实践问题之使用concat_id算子获取用户最近点击的50个商品ID如何解决
B端算法实践问题之使用concat_id算子获取用户最近点击的50个商品ID如何解决
28 1
|
3月前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
4月前
|
算法 数据库
|
3月前
|
存储 算法 数据挖掘
技术分享:从雪花算法生成订单ID的抉择与反思
【8月更文挑战第17天】在软件开发的浩瀚征途中,技术选型如同航海中的罗盘,指引着项目前进的方向。今天,我想与大家分享一段关于“用雪花算法生成订单ID,现在我有点后悔了”的亲身经历,希望通过这段故事,为大家在技术选型时提供一些参考与启示。
89 0
|
4月前
|
文字识别 算法 Java
文本,保存图片09,一个可以用id作为图片名字的pom插件,利用雪花算法生成唯一的id
文本,保存图片09,一个可以用id作为图片名字的pom插件,利用雪花算法生成唯一的id
|
5月前
|
算法 数据中心 Python
基于python雪花算法工具类Snowflake-来自chatGPT
基于python雪花算法工具类Snowflake-来自chatGPT
119 4
|
5月前
|
算法 Java
基于java雪花算法工具类SnowflakeIdUtils-来自chatGPT
基于java雪花算法工具类SnowflakeIdUtils-来自chatGPT
286 3