雪花算法生成id的方法

  介绍

小编给大家分享一下雪花算法生成id的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

雪花算法生成id的方法:首先新建一个id生成的类,然后新建一个调用生成id的单例工具,最后使用函数【GuuidUtil.getUUID()】直接调用即可。

雪花算法生成id的方法

<强>雪花算法生成id的方法:

1,新建一个id生成的类雪花

/* *   * @Auther: lyl   * @Date: 2019/11/21 17:49   * @Description:   */公开课雪花{/* *   *起始的时间戳   */私人最终静态长START_STMP=1480166465631 l;/* *   *每一部分占用的位数   */私人最终静态长SEQUENCE_BIT=12;//序列号占用的位数   私人最终静态长MACHINE_BIT=5;//机器标识占用的位数   私人最终静态长DATACENTER_BIT=5;//数据中心占用的位数/* *   *每一部分的最大值   */私人最终静态长MAX_DATACENTER_NUM=1 l ^ (1 l & lt; & lt;DATACENTER_BIT);   私人最终静态长MAX_MACHINE_NUM=1 l ^ (1 l & lt; & lt;MACHINE_BIT);   私人最终静态长MAX_SEQUENCE=1 l ^ (1 l & lt; & lt;SEQUENCE_BIT);/* *   *每一部分向左的位移   */私人最终静态长MACHINE_LEFT=SEQUENCE_BIT;   私人最终静态长DATACENTER_LEFT=SEQUENCE_BIT + MACHINE_BIT;   私人最终静态长TIMESTMP_LEFT=DATACENTER_LEFT + DATACENTER_BIT;   私人长datacenterId;//数据中心   私人长machineId;//机器标识   私人长=0 l序列;//序列号   私人长lastStmp=1 l;//上一次时间戳   公共雪花(长datacenterId长machineId) {   如果(datacenterId比;MAX_DATACENTER_NUM | | datacenterId & lt;0){   把新的IllegalArgumentException (“datacenterId停下来# 39;t大于MAX_DATACENTER_NUM或者小于0,);   }   如果(machineId比;MAX_MACHINE_NUM | | machineId & lt;0){   把新的IllegalArgumentException (“machineId停下来# 39;t大于MAX_MACHINE_NUM或者小于0,);   }   这一点。datacenterId=datacenterId;   这一点。machineId=machineId;   }/* *   *产生下一个ID   *   * @return   */公共同步长nextId () {   长currStmp=getNewstmp ();   如果(currStmp & lt;lastStmp) {   把新的RuntimeException(“时钟倒退。拒绝生成id");   }   如果(currStmp==lastStmp) {//相同毫秒内,序列号自增   序列=(+ 1)序列,MAX_SEQUENCE;//同一毫秒的序列数已经达到最大   如果(序列==0 l) {   currStmp=getNextMill ();   }   其他}{//不同毫秒内,序列号置为0=0 l序列;   }   lastStmp=currStmp;   返回(currStmp - START_STMP) & lt; & lt;TIMESTMP_LEFT//时间戳部分   | datacenterId & lt; & lt;DATACENTER_LEFT//数据中心部分   | machineId & lt; & lt;MACHINE_LEFT//机器标识部分   |序列;//序列号部分   }   私人长getNextMill () {   长磨机=getNewstmp ();   而(机& lt;=lastStmp) {   机=getNewstmp ();   }   返回工厂;   }   私人长getNewstmp () {   返回System.currentTimeMillis ();   }   公共静态void main (String [] args) {   雪花雪花=new雪花(2、3);   for (int i=0;我& lt;(1)& lt; & lt;12);我+ +){   System.out.println (snowFlake.nextId ());   }   }   }

2,为防止多线程生成重复的id,这边新建了一个调用生成id的单例工具

其中machineId和datacenterId可以放在配置文件中

进口java.util.concurrent.CountDownLatch;/* *   * @Auther: lyl   * @Date: 2019/11/21十八15   * @Description:   */公开课GuuidUtil {   私有静态长machineId=0;   私有静态长datacenterId=0;/* *   *单例模式创建学法算法对象   * */私人enum SnowFlakeSingleton {   单;   私人雪花雪花;   SnowFlakeSingleton () {   雪花=new雪花(datacenterId machineId);   }   公共雪花getInstance () {   返回雪花;   }   }   公共静态长getUUID () {   .nextId返回SnowFlakeSingleton.Singleton.getInstance () ();   }   公共静态void main (String [] args) {   CountDownLatch门闩=new CountDownLatch (10000);   长开始=System.currentTimeMillis ();   for (int i=0;我& lt;10000;我+ +){   新的Runnable () {   @Override   公共空间run () {   System.out.println (GuuidUtil.getUUID ());   latch.countDown ();   }   }.run ();   }   尝试{   System.out.println(“主线程“+ Thread.currentThread () . getname() +“等待子线程执行完成…“);   latch.await();//阻塞当前线程,直到计数器的值为0   System.out.println(“主线程“+ Thread.currentThread () . getname() +“开始执行…“);   }捕捉(InterruptedException e) {   e.printStackTrace ();   }   System.out.print(“雪花算法用时:“);   System.out.println (System.currentTimeMillis()——开始);   }   }

雪花算法生成id的方法