• java写一个用于生成雪花id的工具类


    我们创建一个类 叫 SnowflakeIdGenerator 作为生成雪花id的工具类
    然后 编写代码如下

    public class SnowflakeIdGenerator {
        private static final long START_TIMESTAMP = 1609459200000L; // 设置起始时间戳,可以根据需要进行调整
        private static final long WORKER_ID_BITS = 5L; // 机器ID所占位数
        private static final long DATACENTER_ID_BITS = 5L; // 数据中心ID所占位数
        private static final long SEQUENCE_BITS = 12L; // 序列号所占位数
    
        private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS); // 机器ID的最大值
        private static final long MAX_DATACENTER_ID = ~(-1L << DATACENTER_ID_BITS); // 数据中心ID的最大值
    
        private static final long WORKER_ID_SHIFT = SEQUENCE_BITS; // 机器ID的位移量
        private static final long DATACENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS; // 数据中心ID的位移量
        private static final long TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATACENTER_ID_BITS; // 时间戳的位移量
    
        private static final long SEQUENCE_MASK = ~(-1L << SEQUENCE_BITS); // 序列号的屏蔽位
    
        private final long workerId; // 机器ID
        private final long datacenterId; // 数据中心ID
        private long lastTimestamp = -1L; // 上次生成ID的时间戳
        private long sequence = 0L; // 序列号
    
        public SnowflakeIdGenerator(long workerId, long datacenterId) {
            if (workerId > MAX_WORKER_ID || workerId < 0) {
                throw new IllegalArgumentException("Worker ID 超出范围");
            }
            if (datacenterId > MAX_DATACENTER_ID || datacenterId < 0) {
                throw new IllegalArgumentException("数据中心 ID 超出范围");
            }
            this.workerId = workerId;
            this.datacenterId = datacenterId;
        }
    
        public synchronized long nextId() {
            long timestamp = System.currentTimeMillis();
    
            if (timestamp < lastTimestamp) {
                throw new RuntimeException("系统时间不正确");
            }
    
            if (timestamp == lastTimestamp) {
                sequence = (sequence + 1) & SEQUENCE_MASK;
                if (sequence == 0) {
                    timestamp = tilNextMillis(lastTimestamp);
                }
            } else {
                sequence = 0L;
            }
    
            lastTimestamp = timestamp;
    
            return ((timestamp - START_TIMESTAMP) << TIMESTAMP_LEFT_SHIFT) |
                    (datacenterId << DATACENTER_ID_SHIFT) |
                    (workerId << WORKER_ID_SHIFT) |
                    sequence;
        }
    
        private long tilNextMillis(long lastTimestamp) {
            long timestamp = System.currentTimeMillis();
            while (timestamp <= lastTimestamp) {
                timestamp = System.currentTimeMillis();
            }
            return timestamp;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    然后 只需要在其他类中调用他 获取id即可

    SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1, 1);
    long id = idGenerator.nextId();
    System.out.println("新的雪花ID:" + id);
    
    • 1
    • 2
    • 3

    这里 我们直接new了一个SnowflakeIdGenerator类的实例
    然后 通过nextId获取一个雪花id
    运行结果如下
    在这里插入图片描述
    也是没有任何问题

  • 相关阅读:
    ORB-SLAM3算法学习—Frame构造—ORB特征提取和BRIEF描述子计算
    java-php-python-ssm糖果销售管理系统计算机毕业设计
    创建maven的 java web项目
    Operator 开发实践 六 (API分组)
    Git:代码回溯,分布式版本控制,团队协同开发,远程备份
    35+程序员该怎么办?有哪些破局方法?
    别再吐槽大学教材了,来看看这些网友强推的数学神作!
    Python机器学习分类算法(一)-- 朴素贝叶斯分类(Naive Bayes Classifier)
    【Codeforces Round #811 (Div. 3)】【题目解析+AK代码】
    【Ubuntu小工具安装】
  • 原文地址:https://blog.csdn.net/weixin_45966674/article/details/132925415