使用自定义snowflake算法生成符合要求的ID

面对Snowflake算法生成的ID在前端因超出JSNumber范围导致的重复问题,通过将时间戳从毫秒改为秒,简化ID结构,确保一秒内生成的ID不超过4096个,解决了冲突。若服务器只有一台,还可考虑去掉机器码进一步缩短ID。此方法在确保业务需求的同时降低了ID长度。
摘要由CSDN通过智能技术生成

使用自定义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长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白0806

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值