Class SnowflakeIdWorker

java.lang.Object
cn.xuanyuanli.core.util.snowflake.SnowflakeIdWorker

public class SnowflakeIdWorker extends Object
twitter Snowflake 算法,提供uid生成器
 twitter Snowflake 算法,提供uid生成器:
 SnowFlake的结构如下(每部分用-分开):
 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0
 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
 这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。
 41位的时间截,可以使用69年,年T = (1L invalid input: '<'invalid input: '<' 41) / (1000L * 60 * 60 * 24 * 365) = 69
 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId
12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号

加起来刚好64位,为一个Long型。
Author:
庄梦蝶殇 linhuaichuan1989@126.com
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private static final long
    数据标识id所占的位数
    private static final long
    数据标识id向左移17位(12+5)
    private final long
    数据中心ID(0~31)
    private static final String
     
    private static final String
     
    private static final String
    回拨超时错误
    private boolean
     
    private long
    上次生成ID的时间截
    private static final long
    支持的最大数据标识id,结果是31
    static final long
    支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
    private static final String
     
    private long
    毫秒内序列(0~4095)
    private static final long
    序列在id中占的位数 (表示只允许sequenceId的范围为:0-4095)
    private static final long
    生成序列的掩码,(防止溢出:位与运算保证计算的结果范围始终是 0-4095,0b111111111111=0xfff=4095)
    private static final long
    时间截向左移22位(5+5+12)
    private static final long
    开始时间截 (2017-12-25),用于用当前时间戳减去这个时间戳,算出偏移量
    private static final long
    机器id所占的位数(表示只允许workId的范围为:0-1023)
    private static final long
    机器ID向左移12位
    private final long
    工作机器ID(0~31)
  • Constructor Summary

    Constructors
    Constructor
    Description
    SnowflakeIdWorker(long workerId, long datacenterId)
    构造函数
  • Method Summary

    Modifier and Type
    Method
    Description
    long
    获得下一个ID (该方法是线程安全的)
    反解析UID
    反解析UID(字符串截取,性能相对差;不推荐使用)
    void
    setClock(boolean clock)
     
    protected long
    tilNextMillis(long lastTimestamp)
    保证返回的毫秒数在参数之后(阻塞到下一个毫秒,直到获得新的时间戳)
    protected long
    获得系统当前毫秒数

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • ERROR_CLOCK_BACK

      private static final String ERROR_CLOCK_BACK
      回拨超时错误
      See Also:
    • ERROR_ATTR_LIMIT

      private static final String ERROR_ATTR_LIMIT
      See Also:
    • MSG_UID_PARSE

      private static final String MSG_UID_PARSE
      See Also:
    • DATE_PATTERN_DEFAULT

      private static final String DATE_PATTERN_DEFAULT
      See Also:
    • TWEPOCH

      private static final long TWEPOCH
      开始时间截 (2017-12-25),用于用当前时间戳减去这个时间戳,算出偏移量
      See Also:
    • WORKER_ID_BITS

      private static final long WORKER_ID_BITS
      机器id所占的位数(表示只允许workId的范围为:0-1023)
      See Also:
    • DATACENTER_ID_BITS

      private static final long DATACENTER_ID_BITS
      数据标识id所占的位数
      See Also:
    • MAX_WORKER_ID

      public static final long MAX_WORKER_ID
      支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
      See Also:
    • MAX_DATACENTER_ID

      private static final long MAX_DATACENTER_ID
      支持的最大数据标识id,结果是31
      See Also:
    • SEQUENCE_BITS

      private static final long SEQUENCE_BITS
      序列在id中占的位数 (表示只允许sequenceId的范围为:0-4095)
      See Also:
    • WORKER_ID_SHIFT

      private static final long WORKER_ID_SHIFT
      机器ID向左移12位
      See Also:
    • DATACENTER_ID_SHIFT

      private static final long DATACENTER_ID_SHIFT
      数据标识id向左移17位(12+5)
      See Also:
    • TIMESTAMP_LEFT_SHIFT

      private static final long TIMESTAMP_LEFT_SHIFT
      时间截向左移22位(5+5+12)
      See Also:
    • SEQUENCE_MASK

      private static final long SEQUENCE_MASK
      生成序列的掩码,(防止溢出:位与运算保证计算的结果范围始终是 0-4095,0b111111111111=0xfff=4095)
      See Also:
    • workerId

      private final long workerId
      工作机器ID(0~31)
    • datacenterId

      private final long datacenterId
      数据中心ID(0~31)
    • sequence

      private long sequence
      毫秒内序列(0~4095)
    • lastTimestamp

      private long lastTimestamp
      上次生成ID的时间截
    • isClock

      private boolean isClock
  • Constructor Details

    • SnowflakeIdWorker

      public SnowflakeIdWorker(long workerId, long datacenterId)
      构造函数
      Parameters:
      workerId - 工作ID (0~31)
      datacenterId - 数据中心ID (0~31)
  • Method Details

    • setClock

      public void setClock(boolean clock)
    • nextId

      public long nextId()
      获得下一个ID (该方法是线程安全的)
      Returns:
      SnowflakeId
    • parseUid

      public String parseUid(Long uid)
      反解析UID
      Parameters:
      uid - uid
      Returns:
      String
    • parseUid

      public String parseUid(String uid)
      反解析UID(字符串截取,性能相对差;不推荐使用)
      Parameters:
      uid - uid
      Returns:
      String
    • tilNextMillis

      protected long tilNextMillis(long lastTimestamp)
      保证返回的毫秒数在参数之后(阻塞到下一个毫秒,直到获得新的时间戳)
      Parameters:
      lastTimestamp - 上次生成ID的时间截
      Returns:
      当前时间戳
    • timeGen

      protected long timeGen()
      获得系统当前毫秒数
      Returns:
      当前时间(毫秒)