Class Snowflake

java.lang.Object
org.miaixz.bus.core.data.id.Snowflake
All Implemented Interfaces:
Serializable

public class Snowflake extends Object implements 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

    Fields
    Modifier and Type
    Field
    Description
    static final long
    默认的起始时间,为Thu, 04 Nov 2010 01:42:54 GMT
  • Constructor Summary

    Constructors
    Constructor
    Description
    构造,使用自动生成的工作节点ID和数据中心ID
    Snowflake(long workerId)
    构造
    Snowflake(long workerId, long dataCenterId)
    构造
    Snowflake(long workerId, long dataCenterId, boolean isUseSystemClock)
    构造
    Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock)
     
    Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock, long randomSequenceLimit)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    long
    getDataCenterId(long id)
    根据Snowflake的ID,获取数据中心id
    long
    根据Snowflake的ID,获取生成时间
    getIdScopeByTimestamp(long timestampStart, long timestampEnd)
    根据传入时间戳-计算ID起终点
    getIdScopeByTimestamp(long timestampStart, long timestampEnd, boolean ignoreCenterAndWorker)
    根据传入时间戳-计算ID起终点
    long
    getWorkerId(long id)
    根据Snowflake的ID,获取机器id
    下一个ID
    下一个ID(字符串形式)

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 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 - 终端ID
      dataCenterId - 数据中心ID
    • Snowflake

      public Snowflake(long workerId, long dataCenterId, boolean isUseSystemClock)
      构造
      Parameters:
      workerId - 终端ID
      dataCenterId - 数据中心ID
      isUseSystemClock - 是否使用NonClock 获取当前时间戳
    • Snowflake

      public Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock)
      Parameters:
      epochDate - 初始化时间起点(null表示默认起始日期),后期修改会导致id重复,如果要修改连workerId dataCenterId,慎用
      workerId - 工作机器节点id
      dataCenterId - 数据中心id
      isUseSystemClock - 是否使用NonClock 获取当前时间戳
    • Snowflake

      public Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock, long randomSequenceLimit)
      Parameters:
      epochDate - 初始化时间起点(null表示默认起始日期),后期修改会导致id重复,如果要修改连workerId dataCenterId,慎用
      workerId - 工作机器节点id
      dataCenterId - 数据中心id
      isUseSystemClock - 是否使用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

      public Long next()
      下一个ID
      Returns:
      ID
    • nextString

      public String nextString()
      下一个ID(字符串形式)
      Returns:
      ID 字符串形式
    • getIdScopeByTimestamp

      public Pair<Long,Long> getIdScopeByTimestamp(long timestampStart, long timestampEnd)
      根据传入时间戳-计算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终点