snowflake id雪花id生成算法·改

/**
 * distribute id generate algorithm
 *
 * @author rick.huang
 * @version 1.0
 * @date 2020/12/11 14:02
 */
public class SnowflakeIdUtil {
    /**
     * start time stamp (2020-01-01)
     */
    private static final long startTimeStamp = 1577808000000L;

    /**
     * bytes code for work machine, 1~1023
     */
    private static final int workerIdBits = 10;

    /**
     * bytes code for db
     */
    private static final int datacenterIdBits = 0;

    /**
     * max number of worker
     */
    private static final int maxWorkerId = ~(-1 << workerIdBits);

    /**
     * max number of db
     */
    private static final int maxDatacenterId = ~(-1 << datacenterIdBits);

    /**
     * local sequence id length
     */
    private static final int sequenceBits = 12;

    /**
     * worker id bytes offset
     */
    private static final int workerIdShift = sequenceBits;

    /**
     * db id bytes offset
     */
    private static final int datacenterIdShift = sequenceBits + workerIdBits;

    /**
     * time stamp bytes offset
     */
    private static final int timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;

    /**
     * max sequence id value
     */
    private static final int sequenceMask = ~(-1 << sequenceBits);

    /**
     * worker identity, value 0 not used as identity
     */
    private static int workerId = 0;

    /**
     * db identity, not necessary
     */
    private static int datacenterId;

    /**
     * atomic integer, volatile is not useful here
     */
    private static final AtomicInteger sequence = new AtomicInteger(0);

    /**
     * last used time stamp
     */
    private static final AtomicLong nextTimeStamp = new AtomicLong(Clock.systemUTC().millis());

    /**
     * init snowflake id util, this method showed just call one time
     *
     * @param id worker identity
     */
    public static void init(int id) {
        if (id > maxWorkerId || id < 0) {
            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
        }
        workerId = id;
    }

    /**
     * get next id
     *
     * @return SnowflakeId
     */
    public static long nextId() {
        if (workerId == 0)
            throw new RuntimeException("snowflake util need init first");

        int id = sequence.getAndIncrement();
        long timeStamp = nextTimeStamp.get();

        if (id > sequenceMask) {
            sequence.compareAndSet(id + 1, 0);
            id = sequence.getAndIncrement();
            timeStamp = nextTimeStamp.incrementAndGet();
        }

        return ((timeStamp - startTimeStamp) << timestampLeftShift) //
                | (datacenterId << datacenterIdShift) //
                | (workerId << workerIdShift) //
                | id;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值