雪花算法生成id

目录

雪花算法原理:

雪花算法生成ID的步骤:


 我的其他博客

HTTP与HTTTPS的区别-CSDN博客

什么情况下会产生StackOverflowError(栈溢出)和OutOfMemoryError(堆溢出)怎么排查-CSDN博客

谈谈我对HashMap扩容机制的理解及底层实现-CSDN博客

Redis 两种持久化方式 AOF 和 RDB-CSDN博客MySQL中的锁(简单)-CSDN博客

JDK、JRE、JVM的特点和关联-CSDN博客

面向对象的三大特征-CSDN博客

二分查找(Java) 详细讲解 一文足矣-CSDN博客

首先雪花算法是一种分布式唯一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),会等待下一毫秒再继续生成。

使用Mybatis-Plus生成雪花算法生成id非常简单。Mybatis-Plus已经内置了雪花算法生成分布式唯一id的功能。你可以在IDEA中双击shift搜索Sequence类来查看具体的实现代码。这个类使用的就是雪花算法生成id。关于如何在项目中使用雪花算法生成id,你可以参考CSDN上的一篇博文《mybatis-plus雪花算法增强idworker》。这篇博文详细介绍了如何在Mybatis-Plus中配置和使用雪花算法生成id。你可以按照这篇博文的步骤进行操作,非常简单易懂。总结起来,使用Mybatis-Plus生成雪花算法生成id的步骤包括建表、新建测试工程和单元测试等。在实现分析中,你可以了解到为什么Mybatis-Plus默认就是使用雪花算法生成id。此外,你还可以通过主动设置id生成策略来使用Mybatis-Plus生成雪花算法生成id。Mybatis-Plus还提供了内置的雪花算法工具类IdWorker,方便你在项目中使用雪花算法生成id。希望这些信息对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [mybatis-plus雪花算法生成Id使用详解](https://blog.csdn.net/w1014074794/article/details/125604191)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

薅你两根毛

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值