mysql版 雪花算法_雪花算法如何生成id
雪花算法生成id的方法:首先新建一个id生成的类;然后新建一个调用生成id的单例工具;最后使用函数【GuuidUtil.getUUID()】直接调用即可。
【相关学习推荐:
雪花算法生成id的方法:
1、新建一个id生成的类 SnowFlake/**
* @Auther: lyl
* @Date: 2019/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 << SEQUENCE_BIT);
/**
* 每一部分向左的位移
*/
private final static long MACHINE_LEFT = SEQUENCE_BIT;
private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;
private long datacenterId; //数据中心
private long machineId; //机器标识
private long sequence = 0L; //序列号
private long lastStmp = -1L;//上一次时间戳
public SnowFlake(long datacenterId, long machineId) {
if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {
throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0");
}
if (machineId > MAX_MACHINE_NUM || machineId < 0) {
throw new IllegalArgumentException("machineId can't 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: 2019/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() {
@Override
public 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想了解更多编程学习,敬请关注php培训栏目!
mysql版 雪花算法_雪花算法如何生成id相关推荐
- cb32a_c++_STL_算法_查找算法_(5)adjacent_find
cb32a_c++_STL_算法_查找算法_(5)adjacent_find adjacent_find(b,e),b,begin(),e,end() adjacent_find(b,e,p),p-p ...
- 常用十大算法_回溯算法
回溯算法 回溯算法已经在前面详细的分析过了,详见猛击此处. 简单的讲: 回溯算法是一种局部暴力的枚举算法 循环中,若条件满足,进入递归,开启下一次流程,若条件不满足,就不进行递归,转而进行上一次流程. ...
- long 雪花算法_雪花算法(SnowFlake)Java版
算法原理 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截, ...
- long 雪花算法_雪花算法
小背景:我们的订单编号要求是 16 位,改造了一下雪花算法 * * 参考Twitter Snowflake算法,按实际需求,做了部分修改,结构如下(每部分用-分开): * 0000000000 - 1 ...
- long 雪花算法_雪花算法(snowflake)
简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一个很重要的作用是可以根据时间进行排序.注意,41位时间截不是存储当前时间的时间截, ...
- 接受拒绝算法_通过算法拒绝大学学位
接受拒绝算法 数据科学 (Data Science) Nina was close to tears when she accused Nick Gibb of ruining her life. N ...
- 时间复杂度为on的排序算法_排序算法amp;时间复杂度计算
对于排序算法而言,有几个重要的点: 理解此种排序算法是怎么运行的 理解算法的时间复杂度与空间复杂度计算 递推公式(关乎时间复杂度的计算) 递推公式主要为以下的形式(递归使用的复杂度也这么算): 具体推 ...
- prim算法_贪心算法详解(附例题)
贪心算法的特征规律 贪心算法,"贪心"二字顾名思义,因此其规律特征就是更加注重当前的状态,贪心法做出的选择是对于当前所处状态的最优选择,它的解决问题的视角是微观的"局部& ...
- 蛮力写算法_蛮力算法解释
蛮力写算法 Brute Force Algorithms are exactly what they sound like – straightforward methods of solving a ...
- python序列模式的关联算法_关联算法
以下内容来自刘建平Pinard-博客园的学习笔记,总结如下: 1 Apriori算法原理总结 Apriori算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合 ...
最新文章
- 区块链软件公司:区块链的发展现状
- 基于Session的国际化实现
- HTML5 Shiv #8211; 让该死的IE系列支持HTML5吧
- linux mysql5.6.30 配置_Linux(Red Hat 6 32位) 下安装Mysql5.6.30
- SQLite 3.7.13的加密解密(二)—— 开放宏定义
- Vue 与 Web Components
- 【React】设计高质量的React组件
- emplace_back() 和 push_back 的区别:emplace_back效率高,避免push_back使用时所需的额外副本或移动操作
- OpenGL编程指南(红宝书)第九版使用指南
- win10下SVN图标不显示
- 屌炸天的SpringBoot2 +WxJava 整合微信
- 汇编实验——乐曲程序(两只老虎)
- OSINT + Python #x3D; 自定义黑客
- 阿里云盘内测申请_阿里云网盘 Teambition 内测申请开放!
- 冰河,能不能讲讲如何实现MySQL数据存储的无限扩容?
- 什么是API网关, API 网关的作用
- Android支付宝错误码62009,hb混合开发app 微信支付提示支付宝62009未知错误
- A、B、H、S、N股 各是什么意思
- Hive内部表及外部表
- 给深度学习研究生的入门建议(未完待续ing)
热门文章
- PPT如何制作一级标题、二级标题
- mysql repaire_Repair MySQL Replication遇到的错误(一)
- 自定义PPT背景的大小
- 微信分享返回 错误码 -6 的情况!
- 成功解决Collecting package metadata (current_repodata.json): failedCondaHTTPError: HTTP 000 CONNECTION
- PHILIPS>飞利浦>HX9352>电动牙刷>拆解+维修记录
- POI读取doc,docx文档内容
- 关于设计BOM和制造BOM的介绍
- 致那些徘徊在测试界的屌丝——也致给我自己这个苦逼屌丝
- 下行法求最小割集案例_最小割集求法.docx