snowflake是Twitter开源的分布式ID生成算法,结果是64bit的Long类型的ID,有着全局唯一和有序递增的特点。
- 最高位是符号位,因为生成的 ID 总是正数,始终为0,不可用。
- 41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。
- 10位的机器标识,10位的长度最多支持部署1024个节点。
- 12位的计数序列号,序列号即一系列的自增ID,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。
-
优点
-
唯一性:雪花算法生成的ID是全局唯一的,可以在分布式系统中生成不重复的ID。ID由机器ID、时间戳和序列号组成,结合了这些因素以确保唯一性。
-
可排序性:雪花算法生成的ID包含时间戳,因此ID之间的时间顺序是有意义的。这对于按时间排序的数据非常有用,可以方便地根据ID获取生成的顺序信息。
-
高性能:雪花算法生成ID的过程是基于位运算和位移操作的,计算速度很快,并且生成ID的成本很低。
-
独立性:每个节点(进程或机器)的雪花算法生成ID的过程是相互独立的,不需要依赖于中央系统或数据库。这意味着系统可以水平扩展,并且不会成为单点故障。
-
缺点
-
依赖系统时钟:雪花算法使用时间戳来保证ID的唯一性和可排序性。如果系统时钟发生回退或者不同节点的时钟不同步,可能会导致生成的ID重复或者乱序。
-
有限的容量:雪花算法中的每个部分(机器ID、时间戳和序列号)所占的位数是固定的,这意味着在特定的时间段内和特定机器上,ID的生成数量是有限的。如果超过了容量限制,就需要等待下一个时间戳的到来。
-
无法保证全局唯一性:虽然雪花算法可以在分布式系统中生成相对唯一的ID,但并不能保证全局的唯一性。如果存在多个独立的分布式系统使用相同的机器ID,并且互相不同步时间戳,那么有可能生成重复的ID。
缺点也是有的,就是强依赖机器时钟,如果机器上时钟回拨,有可能会导致主键重复的问题。