写一段生成16位有序ID的snowflake算法代码
时间: 2023-06-20 19:05:42 浏览: 120
动态生产有规律的ID Snowflake算法
以下是一个简单的 Python 实现:
```
import time
class Snowflake:
def __init__(self, machine_id):
self.machine_id = machine_id
self.last_timestamp = -1
self.sequence = 0
def generate_id(self):
timestamp = int(time.time() * 1000)
if timestamp < self.last_timestamp:
raise Exception("Clock moved backwards. Refusing to generate id")
if timestamp == self.last_timestamp:
self.sequence = (self.sequence + 1) & 4095
if self.sequence == 0:
timestamp = self.wait_next_millis(self.last_timestamp)
else:
self.sequence = 0
self.last_timestamp = timestamp
return ((timestamp - 1600000000000) << 22) | (self.machine_id << 12) | self.sequence
def wait_next_millis(self, last_timestamp):
timestamp = int(time.time() * 1000)
while timestamp <= last_timestamp:
timestamp = int(time.time() * 1000)
return timestamp
# 机器 ID,可以根据需要修改
MACHINE_ID = 0
snowflake = Snowflake(MACHINE_ID)
# 生成 10 个 ID
for i in range(10):
print(snowflake.generate_id())
```
在这个实现中,我们使用了当前时间戳和机器ID来生成一个16位的有序ID。具体来说,我们将时间戳左移22位,将机器ID左移12位,然后将序列号与它们组合在一起。序列号是一个12位的自增计数器,如果在同一毫秒内生成多个ID,我们会自动增加序列号来保证ID的唯一性。如果时间戳发生了回拨,我们会等待直到时间戳超过上一个时间戳,以确保生成的ID是有序的。
阅读全文