对比

方案 唯一性 有序性 可用性 自主性 安全性
基于时间的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生成算法,但并非完美解决方案。在使用时,需要根据实际需求和限制条件进行权衡和选择,以寻找适合自己情况的解决方案。

image.png

image.png

固定值:

1bit,最高位是符号位,0 表示正,1 表示负,固定为 0,如果是 1 就是负数了。

时间戳:

41bit,存储毫秒级时间戳(41 位的长度可以使用 69 年)。

标识位(存储机器码):

10bit,上面中的 机器id(5bit)和 服务id(5bit)统一叫作“标识位”,两个标识位组合起来最多可以支持部署 1024 个节点。

序列号: