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

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

美团(Leaf)

百度(uid-generator)

这两个也是业界比较知名的实现雪花算法的工具.

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

<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// 不同毫秒内, 序列号置为0sequence = 0L;}lastTimestamp = timestamp;// 通过按位或将各个部分拼接起来return ((timestamp - twepoch) << timestampLeftShift) // 时间戳部分| (dataCenterId << dataCenterIdShift) // 数据中心部分| (workerId << workerIdShift) // 机器标识部分| sequence; // 序列号部分
}


个人站点
语雀

公众号

hutool工具中的雪花算法相关推荐

  1. 线上使用雪花算法生成id重复问题

    项目中使用的是hutool工具类库提供的雪花算法生成id方式,版本使用的是5.3.1 <dependency><groupId>cn.hutool</groupId> ...

  2. 记一次错误使用雪花算法引起的数据库主键冲突和解决时钟回拨问题

    在分布式系统中,有一些需要使用全局唯一 ID 的场景,这种时候为了防止 ID 冲突可以使用 36 位的 UUID,但是 UUID 有一些缺点,首先他相对比较长,另外 UUID 一般是无序的 有些时候我 ...

  3. 分布式--雪花算法--使用/原理/实例

    原文网址:分布式--雪花算法--使用/原理/实例_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍分布式中的雪花算法.包括:用法.原理. 雪花算法用于生成全局的唯一ID. 使用时的注意事项 需要 ...

  4. 基于雪花算法生成用户id

    8.1 为啥这样做 1.全局唯一性,不会出现重复的id.如果通过id自增来保证id不重复,则该表 无法分表操作例如 服务器A的数据库的user表 数据如下1 小明 男2 小红 女2 张三 男此时 进行 ...

  5. sharding jdbc 的雪花算法中的属性worker.id和max.vibration.offset

    雪花算法生成的id总共64位8个字节,结构如下: 符号位 时间位 工作机器标识位 序列位 1位(固定位0) 41位 10位 12位 worker.id sharding jdbc  4.1.1使用雪花 ...

  6. Java工具类--雪花算法生成全局唯一ID

    import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkI ...

  7. 雪花算法中的时间回拨问题解决方案

    什么是时间回拨问题 雪花算法通过时间来即将作为id的区分标准之一,对于同一台id生成机器,它通过时间和序号保证id不重复 当机器出现问题,时间可能回到之前,此时,时间就不能区分 又或者因为闰秒的出现, ...

  8. 雪花算法(个人笔记)

    关于雪花 雪花(snowflake)在自然界中,是极具独特美丽,又变幻莫测的东西: 雪花属于六方晶系,它具有四个结晶轴,其中三个辅轴在一个基面上,互相以60度的角度相交,第四轴(主晶轴)与三个辅轴所形 ...

  9. 分布式部署ID全局配置之雪花算法

    分布式部署ID全局配置之雪花算法 前言 为什么需要分布式全局唯一ID 以及分布式ID的业务需求? 在复杂分布式系统中,往往需要对大量对数据和消息进行标识 如在美团.支付.餐饮 中 系统的数据日渐增长, ...

最新文章

  1. 【物联网】NB-IoT简介
  2. Cookie实现记住密码、自动登录
  3. linux7 显示登陆,centos7 查看,修改登录日志
  4. Android入门(十七)Android多线程
  5. Python代码高亮显示工具
  6. @Autowired使用
  7. 详解ASP.NET页面的aspx扩展
  8. discuzX 帖子 有的图片没输出 [attach]12323[/attach]的解决办法
  9. java某个起点出发的最长路径_【leetcode-动态规划】矩阵中的最长递增路径
  10. 冲上热搜!快手宣布取消大小周
  11. 对缓存的思考——提高命中率
  12. 28.ldconfig
  13. 机器学习聚类算法:DBSCAN 对鸢尾花数据分类 C++实现
  14. 2022智源大会议程丨类脑计算前沿与挑战
  15. 至于你信不信,反正我信了
  16. PHP面向对象-多态
  17. 计算机状态oxc0000001,电脑蓝屏代码0x00000001解决方法
  18. 高斯混合模型(matlab代码+注释)
  19. 2021年茶艺师(中级)考试及茶艺师(中级)免费试题
  20. Jcmsuite应用:光场遇到纳米球的散射与吸收

热门文章

  1. 牺牲真的是必要的吗?
  2. 设计模式系列之 工厂方法模式
  3. 金山词霸2007注册码
  4. Java之implements
  5. As time goes by
  6. 工业计算机与商用计算机的区别
  7. 树莓派raspberry bullseye扩大虚拟内存
  8. 使用SDEI上报RAS故障
  9. IBM欲加强无人机反应速度:可用来打乒乓球
  10. 解决Microsoft office 2007中PDFMaker 文件遗失问题