一、介绍Hutool工具:
官网地址:简介 | Hutool
Hutool是一个Java工具库,其中包含了各种实用的工具类和方法。通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;
Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug
二、雪花算法:
1.介绍:
雪花算法(Snowflake)是一种分布式唯一ID生成算法,它可以在分布式系统中生成全局唯一的ID。该算法由Twitter开发,用于解决分布式系统中生成唯一ID的需求。
2.核心思想:
雪花算法的核心思想是将一个64位的ID分成多个部分,每个部分表示不同的信息。具体来说,一个雪花ID由以下几个部分组成:
0. 初始位:占一位,默认位0。二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0
-
时间戳:占用41位,表示生成ID的时间戳,精确到毫秒级别。这样可以保证在同一毫秒内生成的ID是唯一的。
-
机器ID:占用10位,表示生成ID的机器的唯一标识。在分布式系统中,每台机器都需要有一个唯一的标识,以防止生成重复的ID。
-
序列号:占用12位,表示同一毫秒内生成的多个ID的序列号。当同一毫秒内生成的ID超过4096个时,序列号会从0开始重新计数。
通过将时间戳、机器ID和序列号组合起来,就可以生成一个全局唯一的ID。
优点:生成的ID有序、趋势递增,并且在分布式系统中具有较高的性能和可靠性。
缺点:雪花算法并不是绝对的全局唯一,因为机器ID需要保证唯一性,而且系统时钟需要保证准确性。如果机器ID重复或者系统时钟回拨,都有可能导致生成重复的ID。
因此,在使用雪花算法时,需要确保机器ID的唯一性,并且对系统时钟进行合理的同步和校准。
三、Hutool实现雪花算法的方式:
1.pom文件
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.16</version> </dependency>
2.代码实现:
public class SnowFlakeUtil { public static void main(String[] args) { //参数1:workerId 终端ID //参数2:dataCenterId 数据中心id Snowflake snowflake = IdUtil.createSnowflake(1,1); long id = snowflake.nextId(); System.out.println("雪花算法1(每次生成一个新对象)实现:"+id); Snowflake secondSnow = IdUtil.getSnowflake(1,1); String secondId = secondSnow.nextIdStr(); System.out.println("单例雪花算法2实现:"+secondId); //注:该方法只能在最新版本5.8.16版本 long threeSnow = IdUtil.getSnowflakeNextId(); System.out.println("单例雪花算法3实现(5.8.16版本):"+threeSnow); } }
四、源码翻看:
版本:5.8.16
1. 创建雪花算法的基础方法:
2.getSnowflakeNextId() 和 getSnowflakeNextStr(),这两个是新版本增加的方法,默认调用的是getSnowflake()方法,生成id
ps:发现了一个解决雪花算法重复问题的解决方案,只是做个记录,具体还得看实际。笔者认为参考博客的解决思路很好,下面是链接
参考连接:(84条消息) 线上使用雪花算法生成id重复问题_snowflake算法出现id重复_Dongguo丶的博客-CSDN博客