工具类:
@Slf4j
public class SnowflakeIdWorker {
// 工作机器ID(0~31)
private final long workerId;
//数据中心ID(0~31)
private final long dataCenterId;
//毫秒内序列(0~4095)
private long sequence = 0L;
public SnowflakeIdWorker(long workerId, long dataCenterId) {
// sanity check for workerId
// 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
long maxWorkerId = ~(-1L << workerIdBits);
if (workerId > maxWorkerId || workerId < 0) {
throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
}
// 支持的最大数据标识id,结果是31
long maxDecenterId = ~(-1L << decenterIdBits);
if (dataCenterId > maxDecenterId || dataCenterId < 0) {
throw new IllegalArgumentException(String.format("dataCenter Id can't be greater than %d or less than 0", maxDecenterId));
}
log.info("worker starting. timestamp left shift = {}, dataCenter id bits = {}, worker id bits = {}, sequence bits = {}, workerid = {}, dataCenterId = {}",
timestampLeftShift, decent