雪花算法
雪花算法ID由64位二进制构成,包含四部分:
- 第1位,共1位,符号位,始终为0
- 2-42位,共41位,毫秒数,约为69年
- 43-52位,共10位,机器标识,可以全部用作机器ID,亦可标识机房ID+机器ID,最多标识1024台机器
- 52-63位,共12位,计数序列号,即每毫秒每台机器可生成ID最大理论数量为4096个
雪花算法存在两个问题:
- 当前机器当前毫秒用完号段如何处理
- 时间跳跃如何处理
雪花漂移算法
https://github.com/yitter/IdGenerator
- 本算法生成的ID由3部分组成(沿用雪花算法定义):
- +-------------------------+--------------+----------+
- | 1.相对基础时间的时间差 | 2.WorkerId | 3.序列数 |
- +-------------------------+--------------+----------+
-
- 第1部分,时间差,是生成ID时的系统时间减去 BaseTime 的总时间差(毫秒单位)。
- 第2部分,WorkerId,是区分不同机器或不同应用的唯一ID,最大值由 WorkerIdBitLength(默认6)限定。
- 第3部分,序列数,是每毫秒下的序列数,由参数中的 SeqBitLength(默认6)限定。
# 基础时间(ms单位), 不能超过当前系统时间
self.base_time = 1582136402000
# 机器码, 必须由外部设定, 最大值 2^worker_id_bit_length-1
self.worker_id = worker_id
# 机器码位长, 默认值6, 取值范围 [1, 15](要求:序列数位长+机器码位长不超过22)
self.worker_id_bit_length = worker_id_bit_length
# 序列数位长, 默认值6, 取值范围 [3, 21](要求:序列数位长+机器码位长不超过22)
self.seq_bit_length = seq_bit_length
# 最大序列数(含), 设置范围 [max_seq_number, 2^seq_bit_length-1]
# 默认值0, 表示最大序列数取最大值(2^seq_bit_length-1])
self.max_seq_number = 0
# 最小序列数(含), 默认值5, 取值范围 [5, max_seq_number], 每毫秒的前5个序列数对应编号0-4是保留位
# 其中1-4是时间回拨相应预留位, 0是手工新值预留位
self.min_seq_number = 5
# 最大漂移次数(含), 默认2000, 推荐范围500-10000(与计算能力有关)
self.top_over_cost_count = 2000