雪花算法原理

原理

雪花算法是分布式系统用来按时间生成有序的唯一ID算法。雪花算法生成的ID是64比特的整型数字,包括了时间戳、机器ID、序列号。时间戳是毫秒级的,机器ID是当前服务器的ID编号(最多1024),序列号是同一毫秒内生成的ID(同一毫秒内最多生成4096个)。

  • 时间戳让ID能够按照时间递增。
  • 机器ID能让分布式系统的各个服务器即使不通信也不会产生相同的ID。
  • 1ms最多4096个ID,1秒409.6万,效率非常高。

image.png

注意:雪花算法严重依赖机器的时间,如果机器时间出现问题,导致回拨,也就是时间回退了,那么可能出现生成ID和以前重复的问题。

  • 解决办法:当前时间小于上一个时间,就停止生成ID。

代码实现

// MID 机器码
const MID = 11

// lastTimestamp 记录上一个时间戳
var lastTimestamp int64 = 0

// seqN 序列号
var seqN int64 = 0

// Snow 雪花算法
func Snow() (int64, error){
   timestampMs := time.Now().UnixMilli() << 22
   if timestampMs < lastTimestamp{
      return 0, errors.New("时钟回拨,生成ID错误")
   }
   if timestampMs != lastTimestamp {
      seqN = 0
      lastTimestamp = timestampMs
   }
   machineID := int64(MID << 12)
   return timestampMs | machineID | seqN, nil
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值