SQL Server 中生成雪花 ID
前言
在我的印象中用到这个雪花 ID 比较少,可能是我接触的大型项目或者开源项目比较少,同时接触到中大型分布式也比较少,基本都是自研系统,用的是自增 ID 和 GuidValue 作为唯一编号。 最近项目上使用了一套第三方框架代码,使用了雪花 ID 作为表的唯一主键,并且之前表没有这个字段,需要进行表迁移的同时初始化雪花 ID 字段值。 因此,趁这次机会简单总结下雪花 ID 以及在 Sql Server 上如何生成雪花 ID。
认识雪花 ID
雪花 ID 是 Twitter 开发的一种分布式唯一 ID 生成算法,主要用于在分布式系统中生成全局唯一的 ID 标识符。它的名称来源于"自然界中没有两片完全相同的雪花"这一概念,象征着每个生成的 ID 都是独一无二的。
雪花 ID 的核心特点
- 全局唯一性:在分布式系统中生成的 ID 不会重复
- 时间有序性:ID 按照时间顺序递增
- 高性能:本地生成,不依赖数据库等外部系统
- 可解析:ID 中包含的信息可以被解析出来
雪花 ID 的结构(64 位)
标准的雪花 ID 由以下三部分组成(共 64 位):
| 1 位符号位 | 41 位时间戳 | 10 位工作节点 ID | 12 位序列号 |
具体分解:
- 符号位(1 位):始终为 0,保证 ID 为正数
- 时间戳(41 位):毫秒级的时间戳,可以使用约 69 年
- 通常从自定义纪元开始计算(如 Twitter 使用 2010-11-04 01:42:54 UTC)
- 工作节点 ID(10 位):
- 通常分为 5 位数据中心 ID + 5 位机器 ID
- 最多支持 32 个数据中心,每个数据中心 32 台机器
- 序列号(12 位):同一毫秒内的序列号,支持每毫秒生成 4096 个 ID
雪花 ID 的优势
- 分布式友好:不同节点可以独立生成 ID 而不需要协调
- 时间有序:生成的 ID 按时间递增,有利于数据库索引
- 高性能:本地生成,不依赖网络或数据库
- 信息丰富:ID 本身包含时间、节点等信息
雪花 ID 的局限性
- 时钟依赖:严重依赖系统时钟,时钟回拨会导致 ID 重复
- 节点 ID 配置:需要手动或通过外部系统分配节点 ID
- 时间耗尽:41 位时间戳大约 69 年后会耗尽
雪花 ID 的应用场景
- 分布式系统主键生成
- 订单号、交易号等业务编号
- 日志跟踪 ID
- 任何需要全局唯一且有序 ID 的场景
示例 ID 解析
假设一个雪花 ID:123456789012345678
转换为二进制后可以解析出:
- 时间戳部分:可以转换为具体的生成时间
- 工作节点部分:知道是在哪个数据中心哪台机器生成的
- 序列号部分:知道这是该毫秒内生成的第几个 ID
雪花 ID 因其简单高效的特性,已经成为分布式系统 ID 生成的经典解决方案之一。
生成雪花 ID
雪花 ID 是 Twitter 提出的一种分布式 ID 生成算法,它生成 64 位的唯一 ID,通常包含时间戳、工作节点 ID 和序列号。 在 SQL Server 中可以通过以下几种方式实现雪花 ID 的生成:



