雪花算法

雪花算法

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())

作者:Esofar

出处:https://www.cnblogs.com/Hqqqq/p/18284876

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   HuangQiaoqi  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示