雪花算法-生成分布式自增ID

  • 2020年5月20日22:31:03
    雪花算法(SnowFlake)

1. 原理

SnowFlake算法生成id的结果是一个64bit大小的整数:
1bit符号位 + 41bit时间戳 + 10bit机器ID + 12bit序列号

雪花算法-生成分布式自增ID_第1张图片
由于在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_第2张图片

优点:

  1. 可以按照时间递增
  2. 支持分布式部署

缺点:

  1. 严重依赖服务器的时钟,如果时钟回拨,会导致时间重复而引发的唯一ID重复

参考:https://blog.csdn.net/u012488504/article/details/82194495

你可能感兴趣的:(信息技术,算法)