| 方案 | 唯一性 | 有序性 | 可用性 | 自主性 | 安全性 |
|---|---|---|---|---|---|
| 基于时间的UUID | 强唯一性 | 时间序+逻辑序 | 高并发可用 | 自主生成 | 暴露时间及MAC |
| 基于随机值的UUID | 依赖随机算法 | 无序 | 依赖随机算法 | 自主生成 | 安全 |
| 基于名字哈希的UUID | 强唯一性 | 无序 | 高可用 | 自主生成 | 较安全 |
| 数据库自增ID | 强唯一性 | 有序 | 较高可用 | 依赖中心主机 | 暴露数量 |
| 数据库批量ID | 强唯一性 | 批量内有序 | 较高可用 | 依赖中心主机 | 暴露数量 |
| 雪花算法 | 较强唯一性 | 时间序+逻辑序 | 高并发可用 | 自主生成 | 暴露时间 |
| 方案 | 冲突率/最高不冲突QPS | 时间复杂度 |
|---|---|---|
| 基于时间的UUID | 10M/s 下不冲突 | 时间戳与时钟序列的获取为固定时间 |
| 基于随机值的UUID | 依赖随机算法 | 依赖随机数生成算法 |
| 基于名字哈希的UUID | SHA1有 1 / 10 ^ 48 的机率冲突 | SHA1算法时间复杂度为固定时间 |
| 数据库自增ID | 不冲突 | InnoDB直接增加内存中计数器的值 |
| 数据库批量ID | 不冲突 | O(n),n为批量值大小 |
| 雪花算法 | 400W/s(取决于序列号位数) | 各部分数值的获取为固定时间 |
| 类别 | 具体指标 | 雪花算法数据 |
|---|---|---|
| 核心性能指标 | 响应时间 | 0.01 ms |
| 核心性能指标 | 并发支持 | 4096 /ms |
| 存储与扩展 | 存储效率 | 8 字节 |
| 存储与扩展 | 最大节点数 | 1024 个 |
| 存储与扩展 | 时间有效期 | 69 年 |
| 性能优势总结 | 核心优势 | 纯内存计算、分布式全局唯一、趋势有序、高并发支持、低存储成本 |
雪花算法依赖于时间的一致性,如果发生时间回拨,可能会导致问题。为了解决这个问题,**通常会使用拓展位来扩展时间戳的位数。**原本雪花算法只能支持69年的时间范围,但根据实际需求,可以增加时间戳的位数来延长可使用的年限,比如使用42位可以支持139年的时间范围。然而,对于很多公司来说,首要任务是生存下来,因此可能会权衡取舍,不过度追求时间戳位数的增加。
需要注意的是,雪花算法也有一些缺点。**在单机上,生成的ID是递增的,但在多台机器上,只能大致保持递增趋势,并不能严格保证递增。这是因为多台机器之间的时钟不一定完全同步。**因此,在多机器环境下,对于严格的递增需求,需要考虑其他解决方案。
总而言之,雪花算法是一种常用的分布式唯一ID生成算法,但并非完美解决方案。在使用时,需要根据实际需求和限制条件进行权衡和选择,以寻找适合自己情况的解决方案。


固定值:
1bit,最高位是符号位,0 表示正,1 表示负,固定为 0,如果是 1 就是负数了。
时间戳:
41bit,存储毫秒级时间戳(41 位的长度可以使用 69 年)。
标识位(存储机器码):
10bit,上面中的 机器id(5bit)和 服务id(5bit)统一叫作“标识位”,两个标识位组合起来最多可以支持部署 1024 个节点。
序列号: