Loading

雪花算法

雪花算法

1.1 概述

雪花算法是twitter开源的一个分布式id的生成算法。雪花id,是分布式计算中使用的唯一标识符的一种形式。该格式由twitter创建。人们普遍认为,每片雪花都有唯一的结构,因此他们取了“雪花ID”这个名字。

1.2 什么是雪花id

雪花id是有一种分布式id算法生成的,他的设计目标是在分布式系统中生成唯一id,具有趋势递增,高性能,可拓展的特点,它可以分为四个部分。

  • 1 符号位:符号位,也就是最高位,始终是0,没有任何意义,因为要是唯一计算机二进制补码中就是负数,0才是正数。
  • 2 时间戳:占用41位,记录生成ID的时间戳,精确到毫秒级。
  • 3 机器标识:占用10位,用于标识不同的机器。
  • 4 计数序列号:占用12位,用于解决同一毫秒内生成多个ID的冲突。

1

1.3 python实现

import time


class Snowflake:
    def __init__(self, machine_id):
        # 当前的唯一机器码
        self.machine_id = machine_id
        # 用于初始和重置序列号
        self.sequence = 0
        # 不存在的时间戳,用于第一次生成id
        self.last_timestamp = -1

    def _get_timestamp(self):
        # 获取当前时间戳(毫秒)
        return int(time.time() * 1000)

    # 等带下一毫秒
    def _til_next_millis(self, last_timestamp):
        timestamp = self._get_timestamp()
        while timestamp <= last_timestamp:
            timestamp = self._get_timestamp()
        return timestamp

    def generate_id(self):
        timestamp = self._get_timestamp()
        # 检测时钟是否回拨
        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._til_next_millis(self.last_timestamp)
        else:
            # 如果不相同,则重置序列号
            self.sequence = 0
        self.last_timestamp = timestamp
        snowflake_id = ((timestamp - 1288834974657) << 22) | (self.machine_id << 12) | self.sequence
        return snowflake_id


if __name__ == "__main__":
    snowflake = Snowflake(machine_id=1)
    for _ in range(10):
        print(snowflake.generate_id())
posted @ 2024-07-04 23:15  HuangQiaoqi  阅读(72)  评论(0编辑  收藏  举报