雪花算法 百度百科,雪花算法生成16位

  雪花算法 百度百科,雪花算法生成16位

  写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用

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

  雪花算法生成id的方法:

  1、新建一个编号生成的类雪花

  /**

  * @Auther: lyl

  * @日期:2019/11/21 17:49

  * @描述:

  */

  公共类雪花{

  /**

  * 起始的时间戳

  */

  私终静态长启动_ STMP=1480166465631 l;

  /**

  * 每一部分占用的位数

  */

  私有最终静态长序列_ BIT=12//序列号占用的位数

  私有最终静态长机器位=5;//机器标识占用的位数

  私人决赛静态long data center _ BIT=5;//数据中心占用的位数

  /**

  * 每一部分的最大值

  */

  私有最终静态长max _ data center _ num=-1l ^(-1l数据中心_ bit);

  私有最终静态long max _ machine _ num=-1l ^(-1l机器_ bit);

  私有最终静态长max _ sequence=-1l ^(-1l序列_比特);

  /**

  * 每一部分向左的位移

  */

  私有最终静态长机器_左=序列_位

  私有最终静态长数据center _ LEFT=SEQUENCE _ BIT MACHINE _ BIT;

  私有最终静态长时间tmp _ LEFT=data center _ LEFT data center _ BIT;

  私有长数据中心Id//数据中心

  私有long machineId//机器标识

  私有长序列=0L//序列号

  private long last stmp=-1L;//上一次时间戳

  公共雪花(长数据中心Id,长机器Id) {

  如果(数据中心Id MAX_DATACENTER_NUM 数据中心Id 0) {

  抛出新的IllegalArgumentException(数据中心id不能大于最大数据中心数量或小于0 );

  }

  如果(机器Id MAX_MACHINE_NUM 机器Id 0) {

  抛出新的IllegalArgumentException(计算机id不能大于最大机器数量或小于0 );

  }

  这个。数据中心id=数据中心id;

  这个。机器id=机器id;

  }

  /**

  * 产生下一个身份

  *

  * @返回

  */

  公共同步长nextId() {

  long curr stmp=getNewstmp();

  if (currStmp lastStmp) {

  抛出新的RuntimeException(时钟向后移动。拒绝生成id’);

  }

  if (currStmp==lastStmp) {

  //相同毫秒内,序列号自增

  序列=(序列1)MAX _ SEQUENCE;

  //同一毫秒的序列数已经达到最大

  if (sequence==0L) {

  curr stmp=getNextMill();

  }

  }否则{

  //不同毫秒内,序列号置为0

  序列=0L

  }

  lastStmp=currStmp

  return(currStmp-START _ STMP)乘以tmp _ LEFT//时间戳部分

   datacenterId DATACENTER_LEFT //数据中心部分

   machineId MACHINE_LEFT //机器标识部分

  序列;//序列号部分

  }

  private long getNextMill() {

  long mill=getNewstmp();

  while (mill=lastStmp) {

  mill=getNewstmp();

  }

  返回磨机;

  }

  private long getNewstmp() {

  返回系统。当前时间毫秒();

  }

  公共静态void main(String[] args) {

  雪花雪花=新雪花(2,3);

  for(int I=0;I(1 12);i ) {

  System.out.println(雪花。nextid());

  }

  }

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

  其中machineId和数据中心身份可以放在配置文件中

  导入Java。util。并发。countdownlatch

  /**

  * @Auther: lyl

  * @日期:2019/11/21 18:15

  * @描述:

  */

  公共类GuuidUtil

  私有静态长机器id=0;

  私有静态长数据中心id=0;

  /**

  * 单例模式创建学法算法对象

  * */

  私有枚举雪片Singleton{

  独生子女;

  私人雪花雪花;

  SnowFlakeSingleton(){

  雪花=新雪花(数据中心Id,机器id);

  }

  公共雪花getInstance(){

  还雪花;

  }

  }

  公共静态long getUUID(){

  返回雪片星顿.Singleton.getInstance().nextId();

  }

  公共静态void main(String[] args) {

  CountDownLatch latch=new CountDownLatch(10000);

  长启动=系统。当前时间毫秒();

  for(int I=0;我10000;i ) {

  新的Runnable() {

  @覆盖

  公共无效运行(){

  系统。出去。println(guuidutil。get uuid());

  闩上。倒计时();

  }

  }.run();

  }

  尝试{

  System.out.println(主线程Thread.currentThread().getName()等待子线程执行完成.);

  闩上。await();//阻塞当前线程,直到计数器的值为0

  System.out.println(主线程Thread.currentThread().getName()开始执行.);

  } catch (InterruptedException e) {

  e。printstacktrace();

  }

  System.out.print(雪花算法用时: );

  系统。出去。println(系统。当前时间毫秒()-开始);

  }

  }最后直接调用:guuidutil。获取uuid();就可以直接生成编号

  以上就是雪花算法如何生成编号的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: