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

  • 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. 实现

三要素:

cnameename
时间戳now
机器IDworkID
序列号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

在这里插入图片描述

优点:

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

缺点:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值