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为字符型