雪花算法

github

https://github.com/T-PWK/flake-idgen

worker_id 是 0-31的机器ID(用来配置分布式的多机器,最多支持32个机器)
个人理解的是在分布式系统中,防止并发导致不同的机器生成相同的ID,所以增加机器ID,用于区分不同的机器。

datacenter_id 是 0-31的数据ID(用来配置某个机器下面的某某服务,每台机器最多支持32个服务)
个人理解是区分不同的应用,如果有多个服务同时产生订单号,那么就可以通过此字段区分一下,但实际上这种情况并不多

epoch - number used to reduce value of a generated timestamp. Note that this number should not exceed number of milliseconds elapsed since 1 January 1970 00:00:00 UTC. It can be used to generate smaller ids.
个人理解是可以手动设置的系统开始时间,如果设置此参数,表示系统从此刻开始,生成的ID从此刻开始生成。这是个时间戳,传的值实际上是一个时间戳,要求这个时间戳不能大于当前时间戳,也就是说这个开始时间,只能晚于当前时间,所以说是用于生成小的ID时使用的。

这里需要注意精度问题,完整的雪花ID是19位数字(64bit)的。而js中的number最多支持16位。
推荐在js中使用BigInt类型,但容易忘记,一般初次接触的,可能会忘记处理而造成错误。

雪花算法的问题:
1.最大值超过jsnumber最大值,需要转成string,极不方便。
2.时间回拨可能存在问题

这里推荐一个优化后的雪花算法,可以解决以上问题
https://github.com/yitter/IdGenerator

中文的,讲的很清楚

作者:朱鹏飞 加我个人微信(zhupengfeivip)进入郑州IT微信交流群
个人博客:https://zhupengfeivip.github.io/
image.png
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/zhupengfei/p/15078197.html