雪花算法(Snowflake)是一种用于生成唯一ID的分布式算法,最初由Twitter提出。它生成的ID是一个64位的长整型数字,结构如下:

  • 1位符号位:始终为0,表示正数。
  • 41位时间戳:表示当前时间与某个固定时间点(如:2021-08-01 00:00:00)的差值,单位是毫秒。
  • 10位机器标识:可以包括数据中心ID和工作节点ID,最多可以支持1024个节点。
  • 12位序列号:在同一毫秒内,同一个节点可以生成的不同ID数。

下面是一个简单的雪花算法实现(Python):

```python import time

class Snowflake: def init(self, datacenter_id, worker_id): self.datacenter_id = datacenter_id self.worker_id = worker_id self.sequence = 0 self.last_timestamp = -1 self.twepoch = 1288834974657

def _til_next_millis(self, last_timestamp):
    timestamp = int(time.time() * 1000)
    while timestamp <= last_timestamp:
        timestamp = int(time.time() * 1000)
    return timestamp

def next_id(self):
    timestamp = int(time.time() * 1000)

    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 - self.twepoch) << 22) | (self.datacenter_id << 17) | (self.worker_id << 12) | self.sequence

使用示例

datacenter_id = 1 worker_id = 1 snowflake = Snowflake(datacenter_id, worker_id) print(snowflake.next_id()) ```

这个实现中,datacenter_idworker_id 是两个必须提供的参数,分别表示数据中心ID和工作节点ID。你可以根据实际需求调整这两个参数的值。