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
}