雪花算法根据时间戳生成有序的 64 bit 的 Long 类型的唯一 ID
各 bit 含义:
- 1 bit: 符号位,0 是正数 1 是负数, ID 为正数,所以恒取 0
- 41 bit: 时间差,我们可以选择一个参考点,用它来计算与当前时间的时间差 (毫秒数),41 bit 存储时间差,足够使用 69 年
- 10 bit: 机器码,能编码 1024 台机器;可以手动指定含义,比如前5 bit 作为机器编号、后 5 bit 作为进程编号
- 12 bit: 序列号,同一机器同一毫秒内产生不同的序列号,12 bit 可以支持 4096 个序列号
优点:
- 灵活配置:机器码可以根据需求灵活配置含义
- 无需持久化:如果序号自增往往需要持久化,本算法不需要持久化
- ID 有含义/可逆性:ID 可以反解出来,对 ID 进行统计分析,可以很简单的分析出整个系统的繁忙曲线,还可以定位到每个机器,在某段时间承担了多少工作,分析出负载均衡情况
- 高性能:生成速度很快
1 | public class Snowflake { |
完整代码:GitHub