雪花算法生成 ID 的结构
- 雪花算法生成的 ID 是一个 64 位的二进制数,由以下几个部分组成:
*其中,各个部分的具体含义如下:
- 时间戳:占用 41 位,记录生成 ID 的时间戳,精确到毫秒级别。
- 机器 ID:占用 10 位,表示生成 ID 的机器的唯一标识。
- 序列号:占用 12 位,表示在同一毫秒内生成的多个 ID 的序号。
雪花算法生成 ID 的过程
- 获取当前时间戳,精确到毫秒级别。
- 计算时间戳的偏移量,将其减去一个起始时间
- 将时间戳、机器 ID 和序列号按位拼接成一个 64 位的二进制数。
- 返回该二进制数作为生成的唯一 ID。
注意事项
- 时间戳部分需要在全局范围内保持唯一性,因此需要确保各个节点的时钟同步。
- 机器 ID 需要在同一个分布式系统中保持唯一性。
- 序列号需要在同一毫秒内保持唯一性,如果同一毫秒内生成的序列号达到了最大值,则需要等到下一毫秒再进行生成。
- 由于时间戳位占用了 41 位,可以表示的时间范围非常广泛,可以使用雪花算法生成的 ID 来满足需求中对于时间顺序、唯一性等方面的要求。
原因
- 花算法生成的 ID 是按照时间顺序递增的,但是并不保证可以直接进行排序。雪花算法生成的 ID 是一个 64 位的整数,由以下几部分组成:
* 1. 时间戳:占用 41 位,记录生成 ID 的时间戳,精确到毫秒级别。
* 2. 机器 ID:占用 10 位,表示生成 ID 的机器的唯一标识。
* 3. 序列号:占用 12 位,表示在同一毫秒内生成的多个 ID 的序号。 - 由于时间戳的高位被占用,同时还有机器 ID 和序列号的存在,因此无法直接通过对雪花算法生成的 ID 进行排序来实现按时间顺序的排序。