雪花算法(Snowflake)是一种分布式系统中生成唯一ID的算法,由Twitter开源。它生成的ID是一个64位的长整型数字,结构如下:
+-----------------------------+
| 41位时间戳 |
| 10位机器标识符 |
| 12位序列号 |
+-----------------------------+
- 时间戳:占用了41位,表示当前时间与某个固定时间点(如:2021-08-01 00:00:00)的差值,单位是毫秒。这部分可以表示约69年的时间。
- 机器标识符:占用了10位,用于标识不同的机器或服务实例。最多可以支持1024个节点。
- 序列号:占用了12位,用于在同一毫秒内生成的不同ID。这部分可以表示约4096个ID。
下面是一个用Python实现的雪花算法示例:
```python import time
class SnowflakeID: def init(self, machine_id): self.machine_id = machine_id self.sequence = 0 self.last_timestamp = -1
def _get_timestamp(self):
return int(time.time() * 1000)
def next_id(self):
timestamp = self._get_timestamp()
if timestamp < self.last_timestamp:
raise Exception("Clock moved backwards. Refusing to generate id for %d milliseconds" % (self.last_timestamp - timestamp))
if timestamp == self.last_timestamp:
self.sequence = (self.sequence + 1) & 0xFFF
if self.sequence == 0:
timestamp = self._til_next_millis(self.last_timestamp)
else:
self.sequence = 0
self.last_timestamp = timestamp
return ((timestamp - 20210801) << 22) | (self.machine_id << 12) | self.sequence
def _til_next_millis(self, last_timestamp):
timestamp = self._get_timestamp()
while timestamp <= last_timestamp:
timestamp = self._get_timestamp()
return timestamp
```
使用示例:
python
id_generator = SnowflakeID(1)
print(id_generator.next_id()) # 输出类似:1628123456789
注意:在实际应用中,需要根据具体的业务场景和需求调整机器标识符的范围和序列号的位数。