public class SnowFlakeIDKeyGenerator extends Object implements IKeyGenerator
雪花算法 ID 生成器。
优化自开源项目:Sequence
| 限定符和类型 | 字段和说明 |
|---|---|
protected InetAddress |
address
IP 地址信息,用来生成工作机器 ID 和数据中心 ID。
|
private static long |
DATA_CENTER_ID_BITS
数据中心 ID 占用的位数(5bit)。
|
private static long |
DATA_CENTER_ID_SHIFT
数据中心 ID 位需要左移的位数(12bit + 5bit)。
|
private long |
dataCenterId
数据中心 ID。
|
private long |
lastTimeMillis
上次生产 ID 时间戳。
|
private static long |
MAX_DATA_CENTER_ID
数据中心 ID 占用 5bit 时的最大值 31。
|
private static long |
MAX_WORKER_ID
工作机器 ID 占用 5bit 时的最大值 31。
|
private static long |
offsetPeriod
可容忍的时间偏移量。
|
private long |
sequence
同一毫秒内的最新序号,最大值可为(2^12 - 1 = 4095)。
|
private static long |
SEQUENCE_BITS
序号占用的位数(12bit)。
|
private static long |
SEQUENCE_MASK
序号掩码,用于与自增后的序列号进行位“与”操作,如果值为 0,则代表自增后的序列号超过了 4095。
|
private static long |
TIMESTAMP_SHIFT
时间戳需要左移的位数(12bit + 5bit + 5bit)。
|
private static long |
twepoch
时间起始标记点,一旦确定不能变动(2023-04-02 13:01:00)。
|
private static long |
WORK_ID_SHIFT
工作机器 ID 位需要左移的位数(12bit)。
|
private static long |
WORKER_ID_BITS
工作机器 ID 占用的位数(5bit)。
|
private long |
workerId
工作机器 ID。
|
| 构造器和说明 |
|---|
SnowFlakeIDKeyGenerator()
雪花算法 ID 生成器。
|
SnowFlakeIDKeyGenerator(InetAddress address)
根据 IP 地址计算数据中心 ID 和工作机器 ID 生成数据库 ID。
|
SnowFlakeIDKeyGenerator(long workerId,
long dataCenterId)
根据数据中心 ID 和工作机器 ID 生成数据库 ID。
|
| 限定符和类型 | 方法和说明 |
|---|---|
Object |
generate(Object entity,
String keyColumn) |
InetAddress |
getAddress() |
long |
getDataCenterId() |
protected long |
getDataCenterId(long maxDataCenterId)
根据网卡 MAC 地址计算余数作为数据中心 ID。
|
long |
getLastTimeMillis() |
static long |
getOffsetPeriod() |
long |
getSequence() |
static long |
getTwepoch() |
long |
getWorkerId() |
protected long |
getWorkerId(long dataCenterId,
long maxWorkerId)
根据 MAC + PID 的 hashCode 获取 16 个低位生成工作机器 ID。
|
long |
nextId()
获取下一个 ID。
|
void |
setAddress(InetAddress address) |
void |
setLastTimeMillis(long lastTimeMillis) |
static void |
setOffsetPeriod(long offsetPeriod) |
void |
setSequence(long sequence) |
static void |
setTwepoch(long twepoch) |
private long |
tilNextMillis(long lastTimestamp)
获取指定时间戳的接下来的时间戳。
|
private static final long WORKER_ID_BITS
private static final long DATA_CENTER_ID_BITS
private static final long SEQUENCE_BITS
private static final long MAX_WORKER_ID
private static final long MAX_DATA_CENTER_ID
private static final long SEQUENCE_MASK
private static final long WORK_ID_SHIFT
private static final long DATA_CENTER_ID_SHIFT
private static final long TIMESTAMP_SHIFT
private static long twepoch
private static long offsetPeriod
private final long workerId
private final long dataCenterId
protected InetAddress address
private long sequence
private long lastTimeMillis
public SnowFlakeIDKeyGenerator()
public SnowFlakeIDKeyGenerator(InetAddress address)
address - IP 地址public SnowFlakeIDKeyGenerator(long workerId, long dataCenterId)
workerId - 工作机器 IDdataCenterId - 数据中心 IDprotected long getWorkerId(long dataCenterId, long maxWorkerId)
protected long getDataCenterId(long maxDataCenterId)
public long nextId()
private long tilNextMillis(long lastTimestamp)
public static long getTwepoch()
public static void setTwepoch(long twepoch)
public static long getOffsetPeriod()
public static void setOffsetPeriod(long offsetPeriod)
public long getWorkerId()
public long getDataCenterId()
public InetAddress getAddress()
public void setAddress(InetAddress address)
public long getSequence()
public void setSequence(long sequence)
public long getLastTimeMillis()
public void setLastTimeMillis(long lastTimeMillis)
Copyright © 2023. All rights reserved.