MENU

snowflake算法生成唯一ID

August 18, 2021 • 编程语言

1. 分布式ID生成器

分布ID的特点:

  • 全局唯一性:不能出现有重复的ID标识,这是基本要求;
  • 递增性:确保生成的ID对于用户或业务是递增的;
  • 高可用性:确保任何时候都能生成正确的ID;
  • 高性能性:在高并发的环境下依然表现良好。

2. snowflake 算法

Twitter 开源的由64位整数组成分布式ID,性能较高,并且在单机上递增:
bba3ac74a14cff54ae6236b3f925e65.png

2.1. 第一位

占用1bit,其值始终是0,无符号整数

2.2. 时间戳

占用41bit,单位为毫秒,总共可以容纳约69年的时间。当然,我们的时间毫秒计数不一定要从1970年开始记,否则32位溢出,即系统跑到2039/9/7 23:47:35 就不能用了,所以这里的时间戳只是相对于某个时间的增量,比如系统上线日期是2000-01-01,那么完全可以把这个timestamp当作是从2000-01-01 00:00:00.000的偏移量。

2.3. 工作机器id

占用10bit,其中高位5bit是数据中心ID,低位5bit是工作节点ID,最多可以容纳1024个节点。

2.4. 序列号

占用12bit,用来记录同毫秒内产生的不同id,每个节点每毫秒0开始不断累加,最多到4096,同一毫秒一共可以生产4096个ID。

snowflake 算法在同一毫秒内最多可以生产多少个全局唯一ID呢?
同一毫秒数量 = 1024*4096 = 4194304

3. snowflake 的Go实现


一个轻量化的 snowflake 的Go实现

1bit Unused41bit Timestamp10bit NodeID12bit SequenceID
000000000000...0...00000000000000000000000000000000