雪花算法生成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相关推荐

  1. 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 ...

  2. 常用十大算法_回溯算法

    回溯算法 回溯算法已经在前面详细的分析过了,详见猛击此处. 简单的讲: 回溯算法是一种局部暴力的枚举算法 循环中,若条件满足,进入递归,开启下一次流程,若条件不满足,就不进行递归,转而进行上一次流程. ...

  3. long 雪花算法_雪花算法(SnowFlake)Java版

    算法原理 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截, ...

  4. long 雪花算法_雪花算法

    小背景:我们的订单编号要求是 16 位,改造了一下雪花算法 * * 参考Twitter Snowflake算法,按实际需求,做了部分修改,结构如下(每部分用-分开): * 0000000000 - 1 ...

  5. long 雪花算法_雪花算法(snowflake)

    简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一个很重要的作用是可以根据时间进行排序.注意,41位时间截不是存储当前时间的时间截, ...

  6. 接受拒绝算法_通过算法拒绝大学学位

    接受拒绝算法 数据科学 (Data Science) Nina was close to tears when she accused Nick Gibb of ruining her life. N ...

  7. 时间复杂度为on的排序算法_排序算法amp;时间复杂度计算

    对于排序算法而言,有几个重要的点: 理解此种排序算法是怎么运行的 理解算法的时间复杂度与空间复杂度计算 递推公式(关乎时间复杂度的计算) 递推公式主要为以下的形式(递归使用的复杂度也这么算): 具体推 ...

  8. prim算法_贪心算法详解(附例题)

    贪心算法的特征规律 贪心算法,"贪心"二字顾名思义,因此其规律特征就是更加注重当前的状态,贪心法做出的选择是对于当前所处状态的最优选择,它的解决问题的视角是微观的"局部& ...

  9. 蛮力写算法_蛮力算法解释

    蛮力写算法 Brute Force Algorithms are exactly what they sound like – straightforward methods of solving a ...

  10. python序列模式的关联算法_关联算法

    以下内容来自刘建平Pinard-博客园的学习笔记,总结如下: 1 Apriori算法原理总结 Apriori算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合 ...

最新文章

  1. 区块链软件公司:区块链的发展现状
  2. 基于Session的国际化实现
  3. HTML5 Shiv #8211; 让该死的IE系列支持HTML5吧
  4. linux mysql5.6.30 配置_Linux(Red Hat 6 32位) 下安装Mysql5.6.30
  5. SQLite 3.7.13的加密解密(二)—— 开放宏定义
  6. Vue 与 Web Components
  7. 【React】设计高质量的React组件
  8. emplace_back() 和 push_back 的区别:emplace_back效率高,避免push_back使用时所需的额外副本或移动操作
  9. OpenGL编程指南(红宝书)第九版使用指南
  10. win10下SVN图标不显示
  11. 屌炸天的SpringBoot2 +WxJava 整合微信
  12. 汇编实验——乐曲程序(两只老虎)
  13. OSINT + Python #x3D; 自定义黑客
  14. 阿里云盘内测申请_阿里云网盘 Teambition 内测申请开放!
  15. 冰河,能不能讲讲如何实现MySQL数据存储的无限扩容?
  16. 什么是API网关, API 网关的作用
  17. Android支付宝错误码62009,hb混合开发app 微信支付提示支付宝62009未知错误
  18. A、B、H、S、N股 各是什么意思
  19. Hive内部表及外部表
  20. 给深度学习研究生的入门建议(未完待续ing)

热门文章

  1. PPT如何制作一级标题、二级标题
  2. mysql repaire_Repair MySQL Replication遇到的错误(一)
  3. 自定义PPT背景的大小
  4. 微信分享返回 错误码 -6 的情况!
  5. 成功解决Collecting package metadata (current_repodata.json): failedCondaHTTPError: HTTP 000 CONNECTION
  6. PHILIPS>飞利浦>HX9352>电动牙刷>拆解+维修记录
  7. POI读取doc,docx文档内容
  8. 关于设计BOM和制造BOM的介绍
  9. 致那些徘徊在测试界的屌丝——也致给我自己这个苦逼屌丝
  10. 下行法求最小割集案例_最小割集求法.docx