雪花算法(Snowflake)是一种分布式系统中生成唯一ID的算法,由Twitter开源。雪花算法生成的ID是一个64位的整数,结构如下:
+----------------------+
| 41 |
| 0 |
+----------------------+
| 0 |
+----------------------+
| 1 |
+----------------------+
| n |
+----------------------+
| 0 |
+----------------------+
| 0 |
+----------------------+
| 0 |
+----------------------+
其中,每个部分的意义如下:
- 41位时间戳:记录当前时间与某个固定时间点(如:2021-01-01 00:00:00)的差值,单位为毫秒。这部分可以表示约69年的时间。
- 10位机器标识:可以部署在1024个节点上,每个节点有一个唯一的标识。
- 12位序列号:在同一毫秒内,同一个节点可以生成的不同ID数,最多可以表示4096个ID。
雪花算法生成的ID是一个递增的序列,因此可以按照时间顺序进行排序。***由于ID是递增的,所以可以避免在数据库中进行范围查询时的性能问题。
以下是一个简单的雪花算法实现(Python):
```python import time
class Snowflake: def init(self, node_id): self.node_id = node_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) & 4095
if self.sequence == 0:
timestamp = self._til_next_millis(self.last_timestamp)
else:
self.sequence = 0
self.last_timestamp = timestamp
return ((timestamp - 1288834974657) << 22) | (self.node_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 node_id = 1 snowflake = Snowflake(node_id)
id1 = snowflake.next_id() id2 = snowflake.next_id()
print(id1) # 输出类似:1625886703338 print(id2) # 输出类似:1625886703339 ```