Twitter 的分布式雪花算法SnowFlake , 经测试 snowflake 每秒能产出26 万个自增可排序的ID
- twitter的SnowFlake生成ID能够按照时间有序生成
- SnowFlake 算法生成id 的结果是一个64 bit 大小的整数,为一个Long 型(转换成字符后长度19位)
- 分布式系统不会产生ID碰撞(由datacenter 和 workerld 区分)并且效率较高
号段解析:
1bit ,
- 不用,因为二进制中最高位是符号位,毫秒级,生成的id一般用整数,所以最高位 0
41bit - 时间戳,用来记录时间戳,毫秒级,
- 41位可以表示 2 ^ {41}-1个数字
- 如果只用来表示正整数(计算机中正整数包含0)。可以表示数值范围:0 至 2^{41}-1 , 减1 是因为表示的数值是从0开始算的 ,而不是1.
- 也就是说 41 位可以表示 2 ^ {41}-1 个毫秒的值,装换成单位年则 (2^{41}-1)/ (1000 *60 *60 *24 *365)=69年
10bit- 工作机器ID,用来记录工作机器ID
- 可以部署在 2^{10} = 1024 个节点,包括5位 datacenterId 和 5位的 workeId
- 5位(bit)可以表示的最大正整数是 2 ^ {5}-1 =31 , 即可以用0、1、2、3....31这32个数字,来表示不同的datacenterId 或者 workId
12 bit -序列号,序列号,用来记录同毫秒内产生的不同的id。
- 12位可以表示的最大正整数是2^{12}-1 = 4095 即可以用0、1、2、34094 这 4095个数字来表示同一机器同一时间(毫秒)产生的4095个ID序号
源码
https://gitee.com/pingfanrenbiji/flowable-springboot-demo/commit/c9af8334cb563b5709e84aca064b245927d5b184
- 执行SnowflakeIdWorker类的main方法
- 启动服务 访问 http://127.0.0.1:8080/snowflake
源码分析
参考官方文档
https://github.com/cloudyan/snowflake