雪花算法(Snowflake Algorithm)是一种由Twitter公司开发并开源的分布式ID生成算法。其核心思想是将64位的long型ID分为四个部分,包括:符号位、时间戳、工作机器ID以及序列号。
snowflake 结构如下图所示:
- 符号位:占1位,由于生成的ID均为正数,因此这一位固定为0。
- 时间戳部分:占41位,用于记录生成ID的时间,这个时间戳是相对于一个固定的起始时间点的,一般是当前系统的启动时间。由于41位的时间戳可以表示的时间范围非常大,所以雪花算法可以在未来的几十年内持续生成唯一的ID。
- 工作机器ID:占10位,包括数据中心标识(5位)和机器标识(5位),支持最多1024个不同的数据中心和每个数据中心内部的1024台机器。通过工作机器ID,不同的机器可以在同一时间生成不同的ID,避免了ID冲突的问题。
- 序列号部分:占12位,同一节点在同一毫秒内生成不同ID时使用,支持每节点每毫秒生成4096个不同的ID。当同一毫秒内的序列号达到4096时,会等待下一毫秒再生成ID。
这种设计使得雪花算法能够在分布式系统中保证ID的唯一性和有序性。生成的ID是一个64位的长整数,其高位是时间戳,中间位是工作机器ID,低位是序列号。由于时间戳的存在,ID具有趋势递增的特性,这对于数据库插入操作等场景是非常有利的。
默认的雪花算法是 64 bit,具体的长度可以自行配置。如果希望运行更久,增加时间戳的位数;如果需要支持更多节点部署,增加标识位长度;如果并发很高,增加序列号位数。
雪花算法并不是一成不变的,可以根据系统内具体场景进行定制。
雪花算法在分布式系统中有着广泛的应用,包括但不限于生成订单号、用户ID、交易ID等场景的数据唯一性,实现不同服务间的异步通信,确保消息的唯一性和去重功能,以及作为加密货币挖矿算法等。