一、简介
二、优点
雪花算法,它至少有如下4个优点:
1.系统环境ID不重复
能满足高并发分布式系统环境ID不重复,比如大家熟知的分布式场景下的数据库表的ID生成。
2.生成效率极高
在高并发,以及分布式环境下,除了生成不重复 id,每秒可生成百万个不重复 id,生成效率极高。
3.保证基本有序递增
基于时间戳,可以保证基本有序递增,很多业务场景都有这个需求。
4.不依赖第三方库
不依赖第三方的库,或者中间件,算法简单,在内存中进行。
三、缺点
依赖服务器时间,服务器时钟回拨时可能会生成重复 id。
四、python 实现
以下示例中,SnowflakeGenerator类代表了一个雪花ID生成器。它使用当前时间戳、工作节点ID和数据中心ID来生成唯一的雪花ID。generate_id方法用于生成ID,它会根据时间戳、序列号和各个ID部分进行位运算,生成最终的64位雪花ID。
请注意,这只是一个简化的示例,实际应用中可能需要根据具体情况进行调整和扩展,例如添加容错处理、分布式部署等。另外,Snowflake算法在分布式环境中可以使用不同的节点ID和数据中心ID来确保生成的ID的唯一性。
import time
class SnowflakeGenerator:
def __init__(self, worker_id, datacenter_id):
self.worker_id = worker_id
self.datacenter_id = datacenter_id
self.sequence = 0
self.last_timestamp = -1
def generate_id(self):
timestamp = int(time.time() * 1000)
if timestamp < self.last_timestamp:
raise Exception("Invalid system clock!")
if timestamp == self.last_timestamp:
self.sequence = (self.sequence + 1) & 4095
if self.sequence == 0:
timestamp = self.wait_next_millisecond(self.last_timestamp)
else:
self.sequence = 0
self.last_timestamp = timestamp
snowflake_id = (
((timestamp - 1609459200000) & 0x3FFFFFFFFFF) << 22
| (self.datacenter_id & 0x1F) << 17
| (self.worker_id & 0x1F) << 12
| (self.sequence & 0xFFF)
)
return snowflake_id
def wait_next_millisecond(self, last_timestamp):
timestamp = int(time.time() * 1000)
while timestamp <= last_timestamp:
timestamp = int(time.time() * 1000)
return timestamp
# 示例用法
generator = SnowflakeGenerator(worker_id=0, datacenter_id=0)
snowflake_id = generator.generate_id()
print(snowflake_id)
五、竞品分析
分布式ID的常见解决方案
1、UUID
Java自带的生成一串唯一随机36位字符串(32个字符串+4个“-”)的算法。它可以保证唯一性,且据说够用N亿年,但是其业务可读性差,无法有序递增。
2、SnowFlake
今天的主角雪花算法,它是Twitter开源的由64位整数组成分布式ID,性能较高,并且在单机上递增。
3、UidGenerator
UidGenerator是百度开源的分布式ID生成器,其基于雪花算法实现。
4、Leaf
Leaf是美团开源的分布式ID生成器,能保证全局唯一,趋势递增,但需要依赖关系数据库、Zookeeper等中间件。
六、使用场景
生成设备的唯一ID