使用自定义snowflake算法生成符合要求的ID
问题背景:项目使用snowflake算法生成Id,前端使用该id时因超出JS Number的最大范围,被自动截取。出现多个id重复的现象。
解决思路:需要减小ID长度。分析雪花片算法ID的组成结构,从而得到减小id长度的方法。
SnowFlake 算法,是 Twitter 开源的分布式 ID 生成算法。由四部分组成:首位无效符、时间戳差值,机器(进程)编码,序列号。
1 bit:我们生成的id都是正数,所以第一个 bit 统一都是 0。
41 bit:表示的是时间戳,单位是毫秒。41 bit 可以表示的数字多达 2^41 - 1,也就是可以标识 2 ^ 41 - 1 个毫秒值,换算成年就是表示 69 年的时间。
10 bit:其中 5 个 bit 代表机房 id,5 个 bit 代表机器 id。
12 bit:这个是用来记录同一个毫秒内产生的不同 id。12 bit 可以代表的最大正整数是 2 ^ 12 - 1 = 4096,也就是说可以用这个 12 bit 代表的数字来区分同一个毫秒内的 4096 个不同的 id。
因为时间紧,决定使用最粗暴的方法,直接减少时间戳部分的长度,由毫秒改为秒。其他不变。这样修改我是经过业务分析,能保证同时在一秒内生成的id不会超过4096个。
代码如下:(因为内网不方便拷贝,直接截图)
当然还有其他方式,如果服务器只有一台,那可以直接去掉10bit机器码,也可以降低id长度。