HuTool 雪花算法 - 解决时钟回拨参考

  • cn.hutool.core.lang.Snowflake
    /*** 默认回拨时间,2S */
    public static long DEFAULT_TIME_OFFSET = 2000L;

    /*** 下一个 ID */
    public synchronized long nextId() {
        long timestamp = genTime();                             // 最新的(当前)时间戳
        if (timestamp < this.lastTimestamp) {                   // 记录时间大于当前时间
            if (this.lastTimestamp - timestamp < timeOffset) {  // 但相差在 2 秒内,则处理回拨
                // 容忍指定的回拨,避免 NTP 校时造成的异常
                timestamp = lastTimestamp;                      // 继续用记录(上一个)时间戳
            } else {
                // 如果服务器时间有问题(时钟后退) 报错。
                throw new IllegalStateException(...);           // 否则抛出异常
            }
        }

        if (timestamp == this.lastTimestamp) {                  // 同一时间戳
            final long sequence = (this.sequence + 1) & SEQUENCE_MASK;  // 追加序号
            if (sequence == 0) {                                // 序号已满
                timestamp = tilNextMillis(lastTimestamp);       // 则等待下一个时间戳 (毫秒)
            }
            this.sequence = sequence;
        } else {
            ... // 随机序号处理
            sequence = 0L;
        }

        lastTimestamp = timestamp;                              // 记录最新的(当前)时间戳

        return ((timestamp - twepoch) << TIMESTAMP_LEFT_SHIFT)  // 减去相对时间戳,再 ( << 22 )
                | (dataCenterId << DATA_CENTER_ID_SHIFT)        // ( << 17 )
                | (workerId << WORKER_ID_SHIFT)                 // ( << 12 )
                | sequence;                                     // 默认 12 位,最大 4095
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值