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写一个爬妹子的爬虫

    下面是关于“利用Python写一个爬妹子的爬虫”的攻略,其中包括以下几个部分: 爬虫工具准备 确定目标网站,分析网站结构 编写爬虫代码 遇到反爬机制的处理 1. 爬虫工具准备 编写爬虫需要使用到Python,建议使用3.x版本。同时还需要安装requests、beautifulsoup4、lxml等库,可以通过pip命令安装。 pip install req…

    python 2023年5月14日
    00
  • 解决Python中的modf()函数取小数部分不准确问题

    当使用Python内置函数modf()函数来获取一个数的小数部分时,可能会发现结果不准确。这是因为某些小数在计算机中无法真正精确表示,因此使用modf()函数得到的结果不一定是准确的。如果你在使用Python开发时遇到这个问题,不要担心,下面是解决这个问题的完整攻略。 问题定位 首先,我们需要明确问题所在。假设要获取数字3.1415926的小数部分,可以使用…

    python 2023年6月3日
    00
  • python数字图像处理之边缘轮廓检测

    Python数字图像处理之边缘轮廓检测攻略 概述 边缘轮廓检测是数字图像处理中常用的技术之一,广泛应用于医疗、安防、工业等各个领域。本篇攻略将会向读者详细介绍Python数字图像处理中边缘轮廓检测的实现方法。 环境准备 本篇攻略使用到的Python库包括:numpy, cv2。请确保在计算机上已经安装了相应的库。 import numpy as np imp…

    python 2023年6月6日
    00
  • 利用python实现聚类分析K-means算法的详细过程

    Python实现K-means聚类算法 K-means聚类算法是一种常用的无监督学习算法,它的主要思想是将数据集划分为K个簇,使得同一簇内的数据点相似度较高,不同簇之间的数据点相似度较低。本文将详细讲解如何使用Python实现K-means聚类算法,并提供两个示例说明。 K-means聚类算法原理 K-means聚类算法的基本思想是从数据集中随机选择K个点作…

    python 2023年5月14日
    00
  • Python3.8安装Pygame教程步骤详解

    下面是关于Python3.8安装Pygame的详细步骤: 步骤一:安装Python3.8 首先,你需要前往Python官网下载Python3.8版本:https://www.python.org/downloads/release/python-380/ 。下载后按照安装向导进行安装即可。 步骤二:安装pip pip是Python的包管理工具,我们需要使用它…

    python 2023年5月14日
    00
  • Python中列表与元组的乘法操作示例

    下面是Python中列表与元组的乘法操作示例的完整攻略。 列表与元组的乘法操作 列表和元组在Python中都支持乘法操作(重复操作)。这个操作会重复列表或元组中的元素,产生一个新的列表或元组。 列表的乘法操作示例 下面是一个列表乘法操作的示例: fruits = [‘apple’, ‘banana’, ‘orange’] print(fruits * 3) …

    python 2023年5月13日
    00
  • Python 函数装饰器应用教程

    让我来为您介绍“Python 函数装饰器应用教程”的完整攻略。 什么是函数装饰器? 函数装饰器是 Python 中非常强大的概念,它可以在不改变原函数代码的情况下,增加或修改原函数的功能。装饰器本质上是一个函数,它接收另一个函数作为参数,并且包装该函数,返回一个新的函数。 函数装饰器通常使用 @decorator_function 的语法来应用,放在被装饰的…

    python 2023年6月3日
    00
  • python批量修改ssh密码的实现

    下面是“Python批量修改SSH密码”的详细实现教程: 目录 准备工作 代码实现 示例说明 3.1 示例一 3.2 示例二 1. 准备工作 在开始之前,需要准备以下工作: 安装Paramiko库:用于操作SSH连接。 pip install paramiko 获取要修改的SSH主机地址、用户名和原始密码信息。 host_ips = ["10.0.…

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