public class Snowflake extends Object implements Serializable
snowflake的结构如下(每部分用-分开):
符号位(1bit)- 时间戳相对值(41bit)- 数据中心标志(5bit)- 机器标志(5bit)- 递增序号(12bit) 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
关于长度是18还是19的问题见:https://blog.csdn.net/unifirst/article/details/80408050
| 限定符和类型 | 字段和说明 |
|---|---|
static long |
DEFAULT_TIME_OFFSET
默认回拨时间,2S
|
static long |
DEFAULT_TWEPOCH
默认的起始时间,为Thu, 04 Nov 2010 01:42:54 GMT
|
| 构造器和说明 |
|---|
Snowflake()
构造,使用自动生成的工作节点ID和数据中心ID
|
Snowflake(Date epochDate,
long workerId,
long dataCenterId,
boolean isUseSystemClock) |
Snowflake(Date epochDate,
long workerId,
long dataCenterId,
boolean isUseSystemClock,
long timeOffset) |
Snowflake(Date epochDate,
long workerId,
long dataCenterId,
boolean isUseSystemClock,
long timeOffset,
long randomSequenceLimit) |
Snowflake(long workerId)
构造
|
Snowflake(long workerId,
long dataCenterId)
构造
|
Snowflake(long workerId,
long dataCenterId,
boolean isUseSystemClock)
构造
|
| 限定符和类型 | 方法和说明 |
|---|---|
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(字符串形式)
|
public static long DEFAULT_TWEPOCH
public static long DEFAULT_TIME_OFFSET
public Snowflake()
public Snowflake(long workerId)
workerId - 终端IDpublic 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 Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock, long timeOffset)
epochDate - 初始化时间起点(null表示默认起始日期),后期修改会导致id重复,如果要修改连workerId dataCenterId,慎用workerId - 工作机器节点iddataCenterId - 数据中心idisUseSystemClock - 是否使用SystemClock 获取当前时间戳timeOffset - 允许时间回拨的毫秒数public Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock, long timeOffset, long randomSequenceLimit)
epochDate - 初始化时间起点(null表示默认起始日期),后期修改会导致id重复,如果要修改连workerId dataCenterId,慎用workerId - 工作机器节点iddataCenterId - 数据中心idisUseSystemClock - 是否使用SystemClock 获取当前时间戳timeOffset - 允许时间回拨的毫秒数randomSequenceLimit - 限定一个随机上限,在不同毫秒下生成序号时,给定一个随机数,避免偶数问题,0表示无随机,上限不包括值本身。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()
Copyright © 2022. All rights reserved.