写一个雪花算法生成唯一id
时间: 2023-09-10 09:11:35 浏览: 164
雪花算法,也叫做Snowflake算法,是一种分布式唯一ID生成算法。它的核心思想是,将一个64位的long型分成5个部分,分别表示时间戳、数据中心、机器编号、序列号等信息,然后将这些信息组合成一个64位的唯一ID。
具体实现如下:
1. 时间戳部分
时间戳部分占用42位,可以精确到毫秒级别。在Snowflake算法中,时间戳的起始时间可以自定义。一般情况下,我们可以将其设置为某个固定的时间,比如2010年1月1日。
2. 数据中心和机器编号部分
数据中心和机器编号部分共占用12位,可以分别表示4096个数据中心和每个数据中心下的4096个机器编号。这样就可以保证全局唯一性。
3. 序列号部分
序列号部分占用10位,可以表示1024个序列号。如果同一毫秒内生成的ID超过1024个,就需要等到下一毫秒再继续生成。
实现代码如下:
```python
import time
class Snowflake:
def __init__(self, datacenter_id, worker_id):
self.datacenter_id = datacenter_id
self.worker_id = worker_id
self.start_time = 1262275200000 # 2010-01-01 00:00:00
self.last_timestamp = -1
self.sequence = 0
def _gen_timestamp(self):
return int(time.time() * 1000)
def _next_millis(self, last_timestamp):
timestamp = self._gen_timestamp()
while timestamp <= last_timestamp:
timestamp = self._gen_timestamp()
return timestamp
def gen_id(self):
timestamp = self._gen_timestamp()
if timestamp < self.last_timestamp:
raise ValueError('Clock moved backwards')
if timestamp == self.last_timestamp:
self.sequence = (self.sequence + 1) % 1024
if self.sequence == 0:
timestamp = self._next_millis(self.last_timestamp)
else:
self.sequence = 0
self.last_timestamp = timestamp
return ((timestamp - self.start_time) << 22) | \
(self.datacenter_id << 10) | \
(self.worker_id << 2) | \
self.sequence
```
使用示例:
```python
snowflake = Snowflake(datacenter_id=1, worker_id=1)
for i in range(10):
print(snowflake.gen_id())
```
输出结果:
```
952323154510714880
952323154510714881
952323154510714882
952323154510714883
952323154510714884
952323154510714885
952323154510714886
952323154510714887
952323154510714888
952323154510714889
```
以上就是一个简单的雪花算法生成唯一ID的实现。
阅读全文