Class SnowflakeIdWorker
java.lang.Object
cn.xuanyuanli.core.util.snowflake.SnowflakeIdWorker
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
FieldsModifier and TypeFieldDescriptionprivate static final long数据标识id所占的位数private static final long数据标识id向左移17位(12+5)private final long数据中心ID(0~31)private static final Stringprivate static final Stringprivate static final String回拨超时错误private booleanprivate long上次生成ID的时间截private static final long支持的最大数据标识id,结果是31static final long支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)private static final Stringprivate 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 -
Method Summary
Modifier and TypeMethodDescriptionlongnextId()获得下一个ID (该方法是线程安全的)反解析UID反解析UID(字符串截取,性能相对差;不推荐使用)voidsetClock(boolean clock) protected longtilNextMillis(long lastTimestamp) 保证返回的毫秒数在参数之后(阻塞到下一个毫秒,直到获得新的时间戳)protected longtimeGen()获得系统当前毫秒数
-
Field Details
-
ERROR_CLOCK_BACK
回拨超时错误- See Also:
-
ERROR_ATTR_LIMIT
- See Also:
-
MSG_UID_PARSE
- See Also:
-
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
反解析UID- Parameters:
uid- uid- Returns:
String
-
parseUid
反解析UID(字符串截取,性能相对差;不推荐使用)- Parameters:
uid- uid- Returns:
String
-
tilNextMillis
protected long tilNextMillis(long lastTimestamp) 保证返回的毫秒数在参数之后(阻塞到下一个毫秒,直到获得新的时间戳)- Parameters:
lastTimestamp- 上次生成ID的时间截- Returns:
- 当前时间戳
-
timeGen
protected long timeGen()获得系统当前毫秒数- Returns:
- 当前时间(毫秒)
-