`

ID Generator算法

 
阅读更多
算法:7位集群+40位时间戳+7位每秒最大生产个数数

适用于集群下唯一id生成:


public class TimeStampIDGenerator{

    /**
     * workerID must be unique for each node in cluster.
     */
    private long workerID;

    private long sequence = 0;
    private long mark = 0;

    private static final int MAXSEQUENCE = 128;
    private static final int MAXWORKERID = 128;

    private long lastTimeGen;

    private final int workerIDBitWidth = 7;
    private final int timeStampBitWidth = 40;
    private final int sequenceBitWidth = 7;

    private long sequenceLeftShift = 0;
    private long timeStampLeftShift = sequenceBitWidth;
    private long workerIDLeftShift = sequenceBitWidth + timeStampBitWidth;

    /**
     * MillSeconds from January 1, 1970 to November 3rd 2010
     */
    private final long TIMEBASELINE = 1288834974657L;

    public long nextId() {
        synchronized (this) {
            long timeGen = timeGen();
            mark++;
            sequence = (++sequence) % MAXSEQUENCE;
            if (timeGen == lastTimeGen) {
                if (mark >= MAXSEQUENCE) {
                    timeGen = tillNextMill();
                    mark = 0;
                }
            } else {
                mark = 0;
            }
            lastTimeGen = timeGen;

            return sequence << sequenceLeftShift | (timeGen - TIMEBASELINE) << timeStampLeftShift
                    | workerID << workerIDLeftShift;
        }

    }

    public void setWorkerID(long id) {
        if (validateWorkerID(id)) {
            workerID = id;
        } else {
            throw new IllegalStateException("invalid id:" + id);
        }
    }

    private boolean validateWorkerID(long id) {
        if (id > MAXWORKERID || id < 0) {
            return false;
        } else {
            return true;
        }
    }

    private long tillNextMill() {
        long timeGen = timeGen();
        while (timeGen <= lastTimeGen) {
            timeGen = timeGen();
        }
        // System.out.println("i'm in tillNextMill");
        return timeGen;
    }

    private long timeGen() {
        return System.currentTimeMillis();
    }

    @Override
    public long generateId() {
        return this.nextId();
    }
}

分享到:
评论

相关推荐

    迄今为止最全面的分布式主键ID生成器,多语言新雪花算法(SnowFlake IdGenerator).zip

    支持容器环境自动扩容(自动注册 WorkerId ),单机或分布式唯一IdGenerator。 迄今为止最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理...

    idgenerator分布式主键ID生成器

    迄今为止最全面的分布式主键ID生成器。优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力...支持容器环境自动扩容(自动注册 WorkerId ),单机或分布式唯一IdGenerator。

    Hibernate的generator属性

    4. **hilo**:高低位算法(Hi-Lo Algorithm),它通过组合高位和低位数字来生成 ID,从而减少对数据库的访问。你需要预先创建一个名为 `high_val` 的表,以及一个 `nextval` 列,还需要指定最大低位值(max_lo)。 ...

    hibernate中的generator的生成方式hibernate中的generator的生成方式

    在Hibernate中,`Generator`是负责生成主键值的策略,通常在`&lt;id&gt;`元素中通过`class`属性指定。不同的数据库和不同的应用场景可能需要不同的生成策略。接下来,我们将逐一介绍各种常见的生成策略及其适用场景。 ###...

    idGenerator

    1. **主文件**:一般命名为`index.js`或`idGenerator.js`,这是库的核心实现,包含了生成唯一ID的算法和函数。可能包含的方法有`generate()`或`createID()`,这些方法内部可能使用了时间戳、随机数、递增计数器等...

    id-generator:自用id生成器

    1. 雪花算法:`id-generator` 可能采用了Twitter开源的Snowflake算法,该算法生成的ID由三部分组成:时间戳、工作节点ID和序列号。时间戳确保了ID的全局唯一性,工作节点ID可以区分不同的服务实例,序列号在每个节点...

    雪花算法中非常好用的数字ID生成器

    最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1...支持容器环境自动扩容(自动注册 WorkerId ),单机或分布式唯一IdGenerator。

    迄今为止最全面的分布式主键ID生成器优化的雪花算法(SnowFlake)雪花漂移算法在缩短ID长度的同时具备高瞬时并发处理能力

    支持容器环境自动扩容(自动注册 WorkerId ),单机或分布式唯一IdGenerator。 这是优化的雪花算法(雪花漂移),它生成的ID更短、速度更快。支持 k8s 等容器环境自动扩容(自动注册 WorkerId),可在单机或分布式...

    多语言版16位、18位、19位雪花ID总汇,包含Java、Go、Python、NodeJs、C#(含.Net core),PHP、Rust、SQL版。

    多语言版、包含生成16位、18位、19位3种长度的...idgenerator 16位雪花ID(多语言版,包括java、C#、Go、Python、NodeJs、PHP、Rust、SQL); itsm-learning 18位雪花ID(C#版); snowflake-net 19位雪花ID(C#版);

    java 获取分布式唯一ID.雪花ID

    public class SnowflakeIdGenerator { private static final SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0); public static long generateId() { return idWorker.nextId(); } } ``` 在这个例子中...

    id_generator

    因此,"ID_generator"可能提供了一种优化的解决方案,比如使用雪花算法(Snowflake Algorithm)或者其他分布式ID生成算法。 雪花算法是由Twitter开源的一种生成全局唯一ID的算法,它的优点在于能够生成具有时间戳、...

    抽奖算法最新

    在计算机科学中,随机数生成器(Random Number Generator, RNG)是关键工具,分为伪随机数生成器(Pseudo-Random Number Generator, PRNG)和真随机数生成器(True Random Number Generator, TRNG)。由于TRNG通常...

    Springboot唯一编号整合,vesta全局唯一id生成器

    Vesta ID Generator是基于Twitter的Snowflake算法实现的,该算法的主要特点是将64位整数分为几个部分:时间戳(毫秒)、工作节点ID(worker ID)和序列号(sequence)。这种设计使得在分布式系统中,每个节点可以...

    idgenerator-go

    一个全新的雪花漂移算法,使生成的ID更短,速度加快。 2.核心在于扩展ID长度的同时,还能拥有极高瞬时并发处理量(保守值50W / 0.1s)。 3.本机支持C#/ Java / Go / Rust / C等语言,并由Rust提供PHP,Python,Node...

    .NET分布式雪花算法生成示例

    public SnowflakeIdGenerator(long workerId) { if (workerId || workerId &gt; 1023) { throw new ArgumentException("WorkerId must be between 0 and 1023"); } this.workerId = workerId; } public long ...

    Snowflake-1.3.1-优化的雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W-0.1s),原生支持

    Snowflake-1.3.1_优化的雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W-0.1s),原生支持 C#-Java...支持容器环境自动扩容(自动注册 WorkerId ),单机或分布式唯一IdGenerator,顶尖优化,超强效能

    双馈式风力发电-Vector Controlled Doubly Fed Induction Generator for Wind Applications.doc

    双馈式风力发电系统是现代风力发电技术中的一个重要组成部分,主要利用了双馈感应发电机(Doubly Fed Induction Generator, DFIG)的工作原理。DFIG是一种具有绕组的转子的感应电机,其独特之处在于可以分别对定子和...

    最全面的分布式主键ID生成器

    最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1...支持容器环境自动扩容(自动注册 WorkerId ),单机或分布式唯一IdGenerator。

    generator.rar

    总的来说,"generator.rar"中的"IdWorker.java"文件是Sharding-JDBC在SpringBoot应用中实现自定义键生成策略的一个实例,它展示了如何利用Snowflake算法生成全局唯一的ID,这对于分布式系统中的数据管理和追踪至关...

    jdk与javauuidgenerator生成uuid

    如果这是某个开源库,那么它可能会提供一些额外的功能,如基于特定算法、性能优化或其他特定需求的UUID生成。为了详细了解这个库,需要查看具体的库文档或源代码。 在实际应用中,UUID常用于数据库主键、分布式系统...

Global site tag (gtag.js) - Google Analytics