Package org.miaixz.bus.core.data.id
Class Snowflake
java.lang.Object
org.miaixz.bus.core.data.id.Snowflake
- All Implemented Interfaces:
Serializable
Twitter的Snowflake 算法
分布式系统中,有一些需要使用全局唯一ID的场景,有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。
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
- Since:
- Java 17+
- Author:
- Kimi Liu
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final long默认的起始时间,为Thu, 04 Nov 2010 01:42:54 GMT -
Constructor Summary
ConstructorsConstructorDescription构造,使用自动生成的工作节点ID和数据中心IDSnowflake(long workerId) 构造Snowflake(long workerId, long dataCenterId) 构造Snowflake(long workerId, long dataCenterId, boolean isUseSystemClock) 构造Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock, long randomSequenceLimit) -
Method Summary
Modifier and TypeMethodDescriptionlonggetDataCenterId(long id) 根据Snowflake的ID,获取数据中心idlonggetGenerateDateTime(long id) 根据Snowflake的ID,获取生成时间getIdScopeByTimestamp(long timestampStart, long timestampEnd) 根据传入时间戳-计算ID起终点getIdScopeByTimestamp(long timestampStart, long timestampEnd, boolean ignoreCenterAndWorker) 根据传入时间戳-计算ID起终点longgetWorkerId(long id) 根据Snowflake的ID,获取机器idnext()下一个ID下一个ID(字符串形式)
-
Field Details
-
DEFAULT_TWEPOCH
public static final long DEFAULT_TWEPOCH默认的起始时间,为Thu, 04 Nov 2010 01:42:54 GMT- See Also:
-
-
Constructor Details
-
Snowflake
public Snowflake()构造,使用自动生成的工作节点ID和数据中心ID -
Snowflake
public Snowflake(long workerId) 构造- Parameters:
workerId- 终端ID
-
Snowflake
public Snowflake(long workerId, long dataCenterId) 构造- Parameters:
workerId- 终端IDdataCenterId- 数据中心ID
-
Snowflake
public Snowflake(long workerId, long dataCenterId, boolean isUseSystemClock) 构造- Parameters:
workerId- 终端IDdataCenterId- 数据中心IDisUseSystemClock- 是否使用NonClock获取当前时间戳
-
Snowflake
- Parameters:
epochDate- 初始化时间起点(null表示默认起始日期),后期修改会导致id重复,如果要修改连workerId dataCenterId,慎用workerId- 工作机器节点iddataCenterId- 数据中心idisUseSystemClock- 是否使用NonClock获取当前时间戳
-
Snowflake
public Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock, long randomSequenceLimit) - Parameters:
epochDate- 初始化时间起点(null表示默认起始日期),后期修改会导致id重复,如果要修改连workerId dataCenterId,慎用workerId- 工作机器节点iddataCenterId- 数据中心idisUseSystemClock- 是否使用NonClock获取当前时间戳randomSequenceLimit- 限定一个随机上限,在不同毫秒下生成序号时,给定一个随机数,避免偶数问题,0表示无随机,上限不包括值本身。
-
-
Method Details
-
getWorkerId
public long getWorkerId(long id) 根据Snowflake的ID,获取机器id- Parameters:
id- snowflake算法生成的id- Returns:
- 所属机器的id
-
getDataCenterId
public long getDataCenterId(long id) 根据Snowflake的ID,获取数据中心id- Parameters:
id- snowflake算法生成的id- Returns:
- 所属数据中心
-
getGenerateDateTime
public long getGenerateDateTime(long id) 根据Snowflake的ID,获取生成时间- Parameters:
id- snowflake算法生成的id- Returns:
- 生成的时间
-
next
下一个ID- Returns:
- ID
-
nextString
下一个ID(字符串形式)- Returns:
- ID 字符串形式
-
getIdScopeByTimestamp
根据传入时间戳-计算ID起终点- Parameters:
timestampStart- 开始时间戳timestampEnd- 结束时间戳- Returns:
- data-ID起点,Value-ID终点
-
getIdScopeByTimestamp
public Pair<Long,Long> getIdScopeByTimestamp(long timestampStart, long timestampEnd, boolean ignoreCenterAndWorker) 根据传入时间戳-计算ID起终点- Parameters:
timestampStart- 开始时间戳timestampEnd- 结束时间戳ignoreCenterAndWorker- 是否忽略数据中心和机器节点的占位,忽略后可获得分布式环境全局可信赖的起终点。- Returns:
- data-ID起点,Value-ID终点
-