- 2020年5月20日22:31:03
雪花算法(SnowFlake)
1. 原理
SnowFlake算法生成id的结果是一个64bit大小的整数:
1bit符号位 + 41bit时间戳 + 10bit机器ID + 12bit序列号
由于在Java中64bit的整数是long类型,所以在Java中SnowFlake算法生成的id就是long来存储的。
SnowFlake可以保证:
- 所有生成的id按时间趋势递增
- 整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分)
2. 实现
三要素:
cname | ename |
---|---|
时间戳 | now |
机器ID | workID |
序列号 | n |
now = time()
if now == last // 同一时间戳,则序列号+1
n ++
if n > 1095 // 雪花算法限定一毫秒内最多生成4096个id
now = nextime()
n = 0
else
n = 0
last = now // 把当前时间戳置为上一时间戳,为后续操作做准备
ID = now << 22 | workID << 12 | n // 最后,时间戳左移22位,机器编号左移12位,与序列号三者做位与运算获得64位id
左移位运算: 将数字的2进制位全部左移若干位
位或运算: 先将运算的数字转换成2进制,相应位上有1则为1,都是0则为0
优点:
- 可以按照时间递增
- 支持分布式部署
缺点:
- 严重依赖服务器的时钟,如果时钟回拨,会导致时间重复而引发的唯一ID重复
参考:https://blog.csdn.net/u012488504/article/details/82194495