1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 雪花算法如何生成id

雪花算法如何生成id

时间:2019-06-09 00:03:10

相关推荐

雪花算法如何生成id

Java|java教程

雪花算法,id

Java-java教程

asp 商城源码,vscode制作控制台,ubuntu播放ape,tomcat新建80端口,python 爬虫gif,php 查询关联表,邯郸seo推广外包公司,小说网站小偷,苹果cms电影天堂模板lzw

【相关学习推荐:java基础】

接水果游戏 源码,vscode高亮+vue,ubuntu 救援,tomcat默认管理,sqlite转化时间函数,插件 affiliate,网站前端ui框架有哪些,python爬虫爬取指定图片,php左右,吉安seo推广优化,电商网站后台,特效html5网页,扁平化个人博客模板lzw

雪花算法生成id的方法:

打字测速源码,优麒麟还是ubuntu,把tomcat注册到服务器,体型大的爬虫,php可视化api工具推荐,企业seo sitelzw

1、新建一个id生成的类 SnowFlake

/** * @Auther: lyl * @Date: /11/21 17:49 * @Description: */public class SnowFlake { /*** 起始的时间戳*/ private final static long START_STMP = 1480166465631L; /*** 每一部分占用的位数*/ private final static long SEQUENCE_BIT = 12; //序列号占用的位数 private final static long MACHINE_BIT = 5; //机器标识占用的位数 private final static long DATACENTER_BIT = 5;//数据中心占用的位数 /*** 每一部分的最大值*/ private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT); private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT); private final static long MAX_SEQUENCE = -1L ^ (-1L < MAX_DATACENTER_NUM || datacenterId MAX_MACHINE_NUM || machineId < 0) { throw new IllegalArgumentException("machineId can be greater than MAX_MACHINE_NUM or less than 0"); } this.datacenterId = datacenterId; this.machineId = machineId; } /*** 产生下一个ID** @return*/ public synchronized long nextId() { long currStmp = getNewstmp(); if (currStmp < lastStmp) { throw new RuntimeException("Clock moved backwards. Refusing to generate id"); } if (currStmp == lastStmp) { //相同毫秒内,序列号自增 sequence = (sequence + 1) & MAX_SEQUENCE; //同一毫秒的序列数已经达到最大 if (sequence == 0L) {currStmp = getNextMill(); } } else { //不同毫秒内,序列号置为0 sequence = 0L; } lastStmp = currStmp; return (currStmp - START_STMP) << TIMESTMP_LEFT //时间戳部分| datacenterId << DATACENTER_LEFT//数据中心部分| machineId << MACHINE_LEFT //机器标识部分| sequence; //序列号部分 } private long getNextMill() { long mill = getNewstmp(); while (mill <= lastStmp) { mill = getNewstmp(); } return mill; } private long getNewstmp() { return System.currentTimeMillis(); } public static void main(String[] args) { SnowFlake snowFlake = new SnowFlake(2, 3); for (int i = 0; i < (1 << 12); i++) { System.out.println(snowFlake.nextId()); } }}

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

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

import java.util.concurrent.CountDownLatch;/** * @Auther: lyl * @Date: /11/21 18:15 * @Description: */public class GuuidUtil { private static long machineId = 0; private static long datacenterId = 0; /*** 单例模式创建学法算法对象* */ private enum SnowFlakeSingleton{ Singleton; private SnowFlake snowFlake; SnowFlakeSingleton(){ snowFlake = new SnowFlake(datacenterId,machineId); } public SnowFlake getInstance(){ return snowFlake; } } public static long getUUID(){ return SnowFlakeSingleton.Singleton.getInstance().nextId(); } public static void main(String[] args) { CountDownLatch latch = new CountDownLatch(10000); long start = System.currentTimeMillis(); for (int i = 0; i < 10000; i++) { new Runnable() {@Overridepublic void run() { System.out.println(GuuidUtil.getUUID()); latch.countDown();} }.run(); } try { System.out.println("主线程"+Thread.currentThread().getName()+"等待子线程执行完成..."); latch.await();//阻塞当前线程,直到计数器的值为0 System.out.println("主线程"+Thread.currentThread().getName()+"开始执行..."); } catch (InterruptedException e) { e.printStackTrace(); } System.out.print("雪花算法用时: "); System.out.println(System.currentTimeMillis() - start); }}

最后直接调用:GuuidUtil.getUUID();就可以直接生成id

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。