雪花算法原理

原理

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

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

雪花算法原理_第1张图片

注意:雪花算法严重依赖机器的时间,如果机器时间出现问题,导致回拨,也就是时间回退了,那么可能出现生成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
}

你可能感兴趣的:(算法)