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

yizhihongxing

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将一个JSON文件中的数据导入到数据库中?

    以下是如何使用Python将一个JSON文件中的数据导入到数据库中的完整使用攻略。 使用Python将一个JSON文件中的数据导入到数据库中的前提条件 在Python将一个JSON文件中的数据导入到数据库中,需要确保已经安装并启动支持导入数据的数据库,例如MySQL或PostgreSQL,并且需要安装Python的相应数据库驱动程序例如mysql-conne…

    python 2023年5月12日
    00
  • Python模块pexpect安装及使用流程

    下面是详细的“Python模块pexpect安装及使用流程”的攻略。在本文中,我们将讨论如何安装和使用Python模块pexpect,以及如何使用它来进行自动化测试。 安装pexpect 在开始之前,确保你已经安装了Python解释器。接下来,我们需要使用pip命令来安装pexpect模块: pip install pexpect 如果命令执行成功的话,你现…

    python 2023年5月14日
    00
  • 如何使用Python在MySQL中使用交叉查询?

    当需要从多个表中检索数据时,可以使用交叉查询将多个表中的所有行组合成单个结果集。在Python中,可以使用MySQL连接来执行交叉查询。以下是在Python中使用交叉查询的完整攻略,包括交叉的基本语法、使用交查询的示例以及如何在Python中使用交叉查询。 交叉查询的基本语法 交查询的基本语法如下: SELECT column_name(s) FROM ta…

    python 2023年5月12日
    00
  • 利用Python实现原创工具的Logo与Help

    利用Python实现原创工具的Logo与Help的攻略要求对Python编程语言有一定的掌握程度,能够熟练使用Python的字符串处理、字典、列表和函数等基本语法进行编程。 一、制作Logo 确认Logo元素 在制作Logo时,首先要确定Logo中所包含的元素,比如Logo需要展示的图形、字体、字号、字形等。 寻找合适的Python库 Python中有很多图…

    python 2023年6月3日
    00
  • 如何将Python字符串转换为JSON的实现方法

    将Python字符串转换为JSON是一种常用的数据格式转换操作,本文将针对如何实现该操作进行详细讲解。 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于理解和编写,常用于前后端接口传输数据。其具有以下几个特点: 轻量级:与XML相比更加简洁 易于理解:通俗易懂 易于解析:各种编程语言均有对应的解…

    python 2023年5月14日
    00
  • python读取中文路径时出错(2种解决方案)

    在Python编程中,有时候我们会遇到读取中文路径时出错的问题。这通常是由于编码问题引起的。本攻略将提供解决问题的两种方法,并提供两个示例。 解决方法 以下是解决读取中文路径时出错的两种方法: os.path.abspath方法 使用os.path.join方法 使用os.path.abspath方法 我们可以使用os.path.abspath方法来解决读取…

    python 2023年5月13日
    00
  • Python反爬机制-验证码功能的具体实现过程

    Python反爬机制-验证码功能的具体实现过程 在本教程中,我们将介绍如何使用Python实现验证码功能,以应对反爬机制。我们将使用Python的Pillow库和pytesseract库来实现这个功能。以下是一个示例代码,演示如何使用Python实现验证码功能: import requests from PIL import Image import pyt…

    python 2023年5月15日
    00
  • python获取中文字符串长度的方法

    获取中文字符串长度是Python编程中常见的需求之一。下面,我将为你讲解一下Python获取中文字符串长度的方法的完整攻略。 1. 中文字符编码方式 首先,我们需要了解中文字符在计算机中的编码方式。在Python 3中,中文字符常常采用Unicode编码(UTF-8或UTF-16)进行存储和传输,一个中文字符占用3或4个字节的存储空间。而在Python 2中…

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