雪花算法生成唯一主键id

雪花算法是一种用于生成全局唯一ID的策略,主要由时间戳、工作机器ID和序列号三部分组成。该算法可以确保在分布式环境中生成69年内不重复的128位ID。在Java实现中,需要注意时间同步问题,以防止ID冲突。
摘要由CSDN通过智能技术生成

雪花算法,用来生成唯一主键.
请添加图片描述
简单来说
1bit不用 始终为零 表示id始终为正数;
41bit时间戳,一般是用当前时间毫秒数减去项目开始时间毫秒数,可以用69年.
10bit工作机器id 表示程序可以部署在2的10次方 1024个节点
12bit序列号,用来应对高并发时在同一毫秒内生成的id,使其得到区分.

整体思路为:

1,检查各部分是否符合要求
2,获取时间戳数值
(1)如果当前时间戳如果小于上次时间戳,则表示时间戳获取出现异常
(2)获取当前时间戳如果等于上次时间戳(同一毫秒内),则在序列号加一;否则序列号赋值为0,从0开始。
(3) 将上次时间戳值刷新
3 用位运算拼接结果.

代码如下:

public class IdWorker{

    //下面两个每个5位,加起来就是10位的工作机器id
    private long workerId;    //工作id
    private long datacenterId;   //数据id
    //12位的序列号
    private long sequence;

    public IdWorker(long workerId, long datacenterId, long sequence){
        // sanity check for workerId
        if (workerId > maxWorkerId || workerId < 0) {
            throw new IllegalArgumentException(String.format("worker Id can't be grea
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的雪花算法(Snowflake)可以用于生成唯一主键ID。下面是一个简单的实现示例: ```java public class SnowflakeIdGenerator { private final static long START_TIMESTAMP = 1614556800000L; // 设置起始时间戳,这里假设为2021-03-01 00:00:00 private final static long DATA_CENTER_ID_BITS = 5L; // 数据中心ID所占的位数 private final static long WORKER_ID_BITS = 5L; // 工作机器ID所占的位数 private final static long SEQUENCE_BITS = 12L; // 序列号所占的位数 private final static long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS); // 支持的最大数据中心ID数量 private final static long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS); // 支持的最大工作机器ID数量 private final static long WORKER_ID_SHIFT = SEQUENCE_BITS; // 工作机器ID左移位数 private final static long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS; // 数据中心ID左移位数 private final static long TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS; // 时间戳左移位数 private final static long SEQUENCE_MASK = ~(-1L << SEQUENCE_BITS); // 序列号掩码 private long workerId; // 工作机器ID private long dataCenterId; // 数据中心ID private long sequence = 0L; // 序列号 private long lastTimestamp = -1L; // 上次生成ID的时间戳 public SnowflakeIdGenerator(long dataCenterId, long workerId) { if (dataCenterId > MAX_DATA_CENTER_ID || dataCenterId < 0) { throw new IllegalArgumentException("Data center ID can't be greater than " + MAX_DATA_CENTER_ID + " or less than 0"); } 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.dataCenterId = dataCenterId; this.workerId = workerId; } public synchronized long generateId() { long currentTimestamp = System.currentTimeMillis(); if (currentTimestamp < lastTimestamp) { throw new RuntimeException("Clock moved backwards. Refusing to generate ID for " + (lastTimestamp - currentTimestamp) + " milliseconds"); } if (currentTimestamp == lastTimestamp) { sequence = (sequence + 1) & SEQUENCE_MASK; if (sequence == 0) { currentTimestamp = tilNextMillis(lastTimestamp); } } else { sequence = 0L; } lastTimestamp = currentTimestamp; return ((currentTimestamp - START_TIMESTAMP) << TIMESTAMP_LEFT_SHIFT) | (dataCenterId << DATA_CENTER_ID_SHIFT) | (workerId << WORKER_ID_SHIFT) | sequence; } private long tilNextMillis(long lastTimestamp) { long timestamp = System.currentTimeMillis(); while (timestamp <= lastTimestamp) { timestamp = System.currentTimeMillis(); } return timestamp; } } ``` 使用示例: ```java public class Main { public static void main(String[] args) { // 创建一个SnowflakeIdGenerator实例,传入数据中心ID和工作机器ID SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1, 1); // 生成ID long id = idGenerator.generateId(); System.out.println("Generated ID: " + id); } } ``` 这样就可以使用雪花算法Java生成唯一主键ID了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值