java Twitter雪花算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java Twitter雪花算法相关的知识,希望对你有一定的参考价值。
/**
* @author Spirit
* @date 2017/12/14
*/
/**
* Twitter 雪花算法
*
* 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
* 1 位标识
* 41 位时间戳
* 10 位数据及机器中心位
* 12 位序列位
*/
public class SnowFlakeUtil {
/** 起始时间戳: 2017-01-01 */
private final long startTimeStamp = 1483200000000L;
public static final int NODE_SHIFT = 10;
public static final int SEQ_SHIFT = 12;
public static final short MAX_NODE = 1024;
public static final short MAX_SEQUENCE = 4096;
private short sequence;
private long referenceTime;
private int node;
public SnowFlakeUtil(int node) {
if (node < 0 || node > MAX_NODE) {
throw new IllegalArgumentException(String.format("node must be between %s and %s", 0, MAX_NODE));
}
this.node = node;
}
public long next() {
long currentTime = System.currentTimeMillis();
long counter;
synchronized(this) {
if (currentTime < referenceTime) {
throw new RuntimeException(String.format("Last referenceTime %s is after reference time %s", referenceTime, currentTime));
} else if (currentTime > referenceTime) {
this.sequence = 0;
} else {
if (this.sequence < SnowFlakeUtil.MAX_SEQUENCE) {
this.sequence++;
} else {
throw new RuntimeException("Sequence exhausted at " + this.sequence);
}
}
counter = this.sequence;
referenceTime = currentTime;
}
return (currentTime - startTimeStamp) << NODE_SHIFT << SEQ_SHIFT | node << SEQ_SHIFT | counter;
}
public static long getLongId(int node) {
SnowFlakeUtil s = new SnowFlakeUtil(node);
return s.next();
}
}
以上是关于java Twitter雪花算法的主要内容,如果未能解决你的问题,请参考以下文章
Twitter的分布式自增ID算法snowflake (Java版)
golang 实现twitter雪花算法
分布式ID生成方案:雪花算法(源自Twitter)
一个类似 Twitter 雪花算法 的 连续序号 ID 产生器 SeqIDGenerator
雪花算法的原理和 Java 实现
mybatis plus 主键生成 Twitter雪花算法 id 及修改id为字符型