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
Modifier and Type | Field and Description |
---|---|
static long |
DEFAULT_TIME_OFFSET
默认回拨时间,2S
|
static long |
DEFAULT_TWEPOCH
默认的起始时间,为Thu, 04 Nov 2010 01:42:54 GMT
|
static long |
MAX_DATA_CENTER_ID |
static long |
MAX_WORKER_ID |
Constructor and Description |
---|
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)
构造
|
Modifier and Type | Method and Description |
---|---|
long |
getDataCenterId(long id)
根据Snowflake的ID,获取数据中心id
|
long |
getGenerateDateTime(long id)
根据Snowflake的ID,获取生成时间
|
Pair<Long,Long> |
getIdScopeByTimestamp(long timestampStart,
long timestampEnd)
根据传入时间戳-计算ID起终点
|
Pair<Long,Long> |
getIdScopeByTimestamp(long timestampStart,
long timestampEnd,
boolean ignoreCenterAndWorker)
根据传入时间戳-计算ID起终点 Gitee/issues/I60M14
|
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 static final long MAX_WORKER_ID
public static final long MAX_DATA_CENTER_ID
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 Pair<Long,Long> getIdScopeByTimestamp(long timestampStart, long timestampEnd)
timestampStart
- 开始时间戳timestampEnd
- 结束时间戳public Pair<Long,Long> getIdScopeByTimestamp(long timestampStart, long timestampEnd, boolean ignoreCenterAndWorker)
timestampStart
- 开始时间戳timestampEnd
- 结束时间戳ignoreCenterAndWorker
- 是否忽略数据中心和机器节点的占位,忽略后可获得分布式环境全局可信赖的起终点。public long nextId()
public String nextIdStr()
Copyright © 2024. All rights reserved.