https://github.com/jokechat/snowflake
https://github.com/jokechat/snowflake
Last synced: 5 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/jokechat/snowflake
- Owner: jokechat
- License: mit
- Created: 2023-10-25T14:16:59.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2025-10-03T10:10:13.000Z (8 months ago)
- Last Synced: 2025-10-03T12:12:07.906Z (8 months ago)
- Language: Go
- Size: 47.9 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
- License: LICENSE
Awesome Lists containing this project
README
由图我们可以看出来,snowFlake ID结构是一个64bit的int型数据。
第1位bit
在二进制中最高位为1,表示的是负数,因为我们使用的id应该都是整数,所以这里最高位应该是0。
41bit时间戳
41位可以表示2^41-1个数字,如果只用来表示正整数,可以表示的数值范围是: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表示当前规则允许分布式最大节点数为1024个节点。这里包括5位的workerID和5位的dataCenterID,这里其实可以不区分,但我下面的代码进行了区分。
12bit-序列号
用来记录同毫秒内产生的不同id。12bit可以表示的最大正整数是2^12-1=4095,即可以用0,1,2,3,......4094这4095个数字,表示同一机器同一时间戳(毫秒)内产生的4095个ID序号。