Python利用雪花算法实现生成唯一ID

Python利用雪花算法实现生成唯一ID

雪花算法简介

雪花算法也叫雪花ID,是以Twitter的Snowflake算法为基础而开发出来的。雪花算法可以生成唯一ID,且有一定的顺序性,适用于分布式系统中的ID生成。

实现原理

雪花ID是64位的,其中第 1 个bit是符号位,始终为0;后41位为时间戳,单位是毫秒级,可以用约69年;接着的10位是机器 ID,可以部署在多台机器上,每台机器分配不同的ID;最后的12位是序列号,同毫秒内产生的ID序号,能够生成预计4个序列,最多4096个ID。

Python实现

下面将通过Python实现雪花算法生成唯一ID。

import time
import threading

# 定义全局变量为0
seq = 0
last_timestamp = -1

def gen_id():
    global seq
    global last_timestamp

    # 获取时间戳并转换为毫秒
    timestamp = int(time.time() * 1000)

    if last_timestamp > timestamp:
        raise ValueError("Clock moved backwards. Refusing to generate id")

    if last_timestamp == timestamp:
        seq = (seq + 1) & 0xFFF   # 4095

        if seq == 0:
            timestamp = til_next_millis(last_timestamp)
    else:
        seq = 0

    last_timestamp = timestamp

    # 偏移时间戳
    timestamp -= 1546300800000  # 2019-01-01

    return (timestamp << 22) | (0 << 12) | seq

def til_next_millis(last_timestamp):
    timestamp = int(time.time() * 1000)

    while timestamp <= last_timestamp:
        timestamp = int(time.time() * 1000)

    return timestamp

if __name__ == '__main__':
    num_threads=10
    def id_worker():
        thread_name = threading.currentThread().getName()
        for j in range(5):
            print("thread-{} id={}".format(thread_name, gen_id()))

    threads = []
    for i in range(num_threads):
        t = threading.Thread(target=id_worker)
        threads.append(t)

    for t in threads:
        t.start()

    for t in threads:
        t.join()

在上述代码中,代码中的def gen_id()函数实现了ID的生成。全局变量last_timestamp用来记录上次生成ID时的时间戳,全局变量seq用来记录序列号,两个变量用来实现顺序性要求。if判断语句用来保证ID在本机时间内的唯一性。最后,代码通过位运算,将时间戳向左移动22位,机器ID向左移动12位,序列号直接累加,将位运算结果合并返回生成的唯一ID。

示例说明

下面给出两个示例说明。

示例1

假设在分布式系统中,我们要求生成ID的总长度为20位,其中10位表示当前机器的编号,10位表示时间戳加序列号。

  • 假设当前机器的编号为100,则机器ID为0000000110;
  • 假设当前时间为2022年8月8日10点20分30秒,毫秒为500,则对应的时间戳为9447280220500;
  • 假设当前时间戳下的序列号为50,则对应的序列号为000110010;

则该ID生成的结果为:11000000001110010050。

示例2

假设在分布式系统中,我们要求生成ID的总长度为10位。

  • 假设当前机器的编号为50,则机器ID为000001100;
  • 假设当前时间戳下的序列号为250,则对应的序列号为0111111010;

则该ID生成的结果为:00001100000111111010。

总结

通过Python实现雪花算法生成唯一ID,能实现自己ID的生成,以便分布式系统的使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python利用雪花算法实现生成唯一ID - Python技术站

(1)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • Python numpy.find_common_type()函数

    下面是Python numpy.find_common_type()函数的完整攻略。 函数介绍 numpy.find_common_type()函数用于确定多个数组中公共的数据类型。 函数签名如下: numpy.find_common_type(types, reference=None) 参数解释: types:要比较的数据类型序列,可以是列表、元组或nu…

    python-answer 2023年3月25日
    00
  • python中对列表的删除和添加方法详解

    下面是关于Python中对列表的删除和添加方法的详细攻略,包含两个示例说明。 添加元素 在Python中,我们可以使用append()方法向列表末尾添加一个元素,使用insert()方法指定位置插入一个元素。下面是示例: # 使用append()方法向列表末尾添加一个元素 my_list = [1, 2, 3] my_list.append(4) print…

    python 2023年5月13日
    00
  • 如何对csv文件数据分组,并用pyecharts展示

    下面是详细讲解“如何对CSV文件数据分组, 并用pyecharts展示”的完整攻略。 1. 加载csv文件 首先,我们需要读取CSV文件中的数据。一般使用Python内置的CSV模块来读写CSV文件,代码如下: import csv with open(‘data.csv’, ‘r’) as f: reader = csv.reader(f) data = …

    python 2023年6月3日
    00
  • Python实现人机中国象棋游戏

    Python实现人机中国象棋游戏是一门介绍用Python编写人机中国象棋游戏的教程,本文将使用markdown格式详细讲解该课程的完整攻略。 课程概述 该课程主要介绍如何使用Python语言编写一个简单的人机中国象棋游戏,主要包括如何实现用户界面、各种棋子的走法和游戏规则等内容。课程难度适中,掌握一定的Python语言基础即可。 实现步骤 本课程的实现步骤可…

    python 2023年5月23日
    00
  • 详解Python3 基本数据类型

    详解Python3基本数据类型 Python3中的数据类型主要分为以下几类: 数字类型(Number) 字符串类型(String) 列表类型(List) 元组类型(Tuple) 字典类型(Dictionary) 集合类型(Set) 接下来,我们分别详解每种数据类型。 数字类型(Number) Python3支持三种不同的数字类型:整型(int)、浮点型(fl…

    python 2023年5月14日
    00
  • 使用python自动办公的实例代码

    下面是使用Python自动办公的实例代码的完整攻略。 什么是Python自动办公 Python自动办公,是指使用Python编程语言,对办公软件的操作进行自动化脚本编写,以减少人力和提高工作效率。常见的办公软件包括Microsoft Office等。 Python自动办公的优点 使用Python自动办公,有以下几个优点: 提高工作效率,减少人力成本。 减少手…

    python 2023年5月19日
    00
  • python的Template使用指南

    Python的Template使用指南 在Python中,Template是一个字符串模板类,它提供了一种简单的方式来格式化字符串。本文将介绍Python的Template使用指南,包括Template的基本用法、变量替换、转义字符、自定义分隔符和示例说明。 Template的基本用法 在Python中,我们可以使用Template类来创建一个字符串模板。以…

    python 2023年5月14日
    00
  • 详解分布式系统中如何用python实现Paxos

    一、背景 Paxos是一种分布式算法,它可以让多个节点协同达成共识,解决在分布式系统中节点之间达成一致的问题。Python是目前最流行的编程语言之一,具有易学易用、灵活的特点,也非常适合用于分布式系统的开发。本文旨在详解如何使用Python实现Paxos算法。 二、Paxos算法实现 Phase1: Prepare Paxos算法的第一阶段是Prepare阶…

    python 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部