介绍
小编给大家分享一下雪花算法生成id的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
雪花算法生成id的方法:首先新建一个id生成的类,然后新建一个调用生成id的单例工具,最后使用函数【GuuidUtil.getUUID()】直接调用即可。
引用>
<强>雪花算法生成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的方法