public class Snowflake extends Object implements Serializable
snowflake的结构如下(每部分用-分开):
0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
第一位为未使用(符号位表示正数),接下来的41位为毫秒级时间(41位的长度可以使用69年)
然后是5位datacenterId和5位workerId(10位的长度最多支持部署1024个节点)
最后12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)
并且可以通过生成的id反推出生成时间,datacenterId和workerId
参考:http://www.cnblogs.com/relucent/p/4955340.html
| 限定符和类型 | 字段和说明 |
|---|---|
private long |
dataCenterId |
private long |
dataCenterIdBits |
private long |
dataCenterIdShift |
private long |
lastTimestamp |
private long |
maxDataCenterId |
private long |
maxWorkerId |
private long |
sequence |
private long |
sequenceBits |
private long |
sequenceMask |
private static long |
serialVersionUID |
private long |
timestampLeftShift |
private long |
twepoch |
private boolean |
useSystemClock |
private long |
workerId |
private long |
workerIdBits |
private long |
workerIdShift |
| 构造器和说明 |
|---|
Snowflake(Date epochDate,
long workerId,
long dataCenterId,
boolean isUseSystemClock) |
Snowflake(long workerId,
long dataCenterId)
构造
|
Snowflake(long workerId,
long dataCenterId,
boolean isUseSystemClock)
构造
|
| 限定符和类型 | 方法和说明 |
|---|---|
private long |
genTime()
生成时间戳
|
long |
getDataCenterId(long id)
根据Snowflake的ID,获取数据中心id
|
long |
getGenerateDateTime(long id)
根据Snowflake的ID,获取生成时间
|
long |
getWorkerId(long id)
根据Snowflake的ID,获取机器id
|
long |
nextId()
下一个ID
|
String |
nextIdStr()
下一个ID(字符串形式)
|
private long |
tilNextMillis(long lastTimestamp)
循环等待下一个时间
|
private static final long serialVersionUID
private final long twepoch
private final long workerIdBits
private final long dataCenterIdBits
private final long maxWorkerId
private final long maxDataCenterId
private final long sequenceBits
private final long workerIdShift
private final long dataCenterIdShift
private final long timestampLeftShift
private final long sequenceMask
private final long workerId
private final long dataCenterId
private final boolean useSystemClock
private long sequence
private long lastTimestamp
public Snowflake(long workerId,
long dataCenterId)
workerId - 终端IDdataCenterId - 数据中心IDpublic Snowflake(long workerId,
long dataCenterId,
boolean isUseSystemClock)
workerId - 终端IDdataCenterId - 数据中心IDisUseSystemClock - 是否使用SystemClock 获取当前时间戳public Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock)
epochDate - 初始化时间起点(null表示默认起始日期),后期修改会导致id重复,如果要修改连workerId dataCenterId,慎用workerId - 工作机器节点iddataCenterId - 数据中心idisUseSystemClock - 是否使用SystemClock 获取当前时间戳public long getWorkerId(long id)
id - snowflake算法生成的idpublic long getDataCenterId(long id)
id - snowflake算法生成的idpublic long getGenerateDateTime(long id)
id - snowflake算法生成的idpublic long nextId()
public String nextIdStr()
private long tilNextMillis(long lastTimestamp)
lastTimestamp - 上次记录的时间private long genTime()
Copyright © 2020. All rights reserved.