温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Hutool怎么实现雪花算法

发布时间:2021-12-31 16:59:54 来源:亿速云 阅读:370 作者:iii 栏目:大数据

本篇内容介绍了“Hutool怎么实现雪花算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Hutool怎么实现雪花算法

如果在面试中被问及分布式唯一标识,却没有答道雪花算法,那么就有点说不过去了.

关于分布式唯一标识中的雪花算法,网络上的介绍很多,它只是一个算法,可以用Python,Java等不同的语言实现它.即便是同一个语言,它的实现也有不同.

然而还有一个工具类,它就是

Hutool怎么实现雪花算法

<dependency>   <groupId>cn.hutool</groupId>   <artifactId>hutool-all</artifactId>   <version>5.4.2</version></dependency>

在它的内部也实现和提供了雪花算法,在这里,我们就拿它作为讲解雪花算法的案例.

cn.hutool.core.lang.Snowflake

最核心的方法就是下面这个

public synchronized long nextId() {   // 获取当前时间戳   long timestamp = genTime();   // lastTimestamp表示你的程序在最后一次获取分布式唯一标识的时间戳(ms)   // 一台机器正常情况下,timestamp 是要大于 lastTimestamp的.如果timestamp < lastTimestamp表明服务器的时间有问题,存在时钟后退.   if (timestamp < lastTimestamp) {       // 容忍2秒内的时钟后退       if(lastTimestamp - timestamp < 2000){           timestamp = lastTimestamp;      } else{           // 如果服务器时间有问题(时钟后退) 报错。           throw new IllegalStateException(StrUtil.format("Clock moved backwards. Refusing to generate id for {}ms", lastTimestamp - timestamp));      }  }
  if (timestamp == lastTimestamp) {       // 相同毫秒内,序列号自增       sequence = (sequence + 1) & sequenceMask;       // 同一毫秒的序列数已经达到最大       if (sequence == 0) {           // 循环等待下一个时间           timestamp = tilNextMillis(lastTimestamp);      }  } else {// timestamp > lastTimestamp       // 不同毫秒内, 序列号置为0       sequence = 0L;  }
  lastTimestamp = timestamp;
  // 通过按位或将各个部分拼接起来   return ((timestamp - twepoch) << timestampLeftShift) // 时间戳部分       | (dataCenterId << dataCenterIdShift) // 数据中心部分       | (workerId << workerIdShift) // 机器标识部分       | sequence; // 序列号部分}

“Hutool怎么实现雪花算法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI