当前位置: 首页 > news >正文

使用雪花算法(Snowflake Algorithm)在Python中生成唯一ID

使用雪花算法Snowflake Algorithm在Python中生成唯一ID

  • 使用雪花算法(Snowflake Algorithm)在Python中生成唯一ID
    • 雪花算法简介
    • Python实现
    • 代码解析
    • 使用示例
    • 优势
    • 注意事项
    • 适用场景
    • 结论

使用雪花算法(Snowflake Algorithm)在Python中生成唯一ID

在分布式系统中生成唯一ID是一个常见的需求。Twitter的雪花算法(Snowflake Algorithm)是一种优秀的解决方案,它可以生成64位的唯一ID,包含时间戳、工作机器ID和序列号。今天,我们将探讨如何在Python中实现雪花算法。

雪花算法简介

雪花算法生成的ID结构如下:

  • 1位符号位(始终为0)
  • 41位时间戳(毫秒级)
  • 5位数据中心ID
  • 5位工作机器ID
  • 12位序列号

这种结构允许在同一毫秒内生成4096个唯一ID,并支持多个数据中心和工作机器。

Python实现

import time
import threadingclass SnowflakeGenerator:def __init__(self, datacenter_id, worker_id):self.datacenter_id = datacenter_idself.worker_id = worker_idself.sequence = 0self.last_timestamp = -1# Bit lengths for different partsself.datacenter_id_bits = 5self.worker_id_bits = 5self.sequence_bits = 12# Maximum valuesself.max_datacenter_id = -1 ^ (-1 << self.datacenter_id_bits)self.max_worker_id = -1 ^ (-1 << self.worker_id_bits)self.max_sequence = -1 ^ (-1 << self.sequence_bits)# Shift amountsself.worker_id_shift = self.sequence_bitsself.datacenter_id_shift = self.sequence_bits + self.worker_id_bitsself.timestamp_shift = self.sequence_bits + self.worker_id_bits + self.datacenter_id_bitsself.lock = threading.Lock()def _current_milliseconds(self):return int(time.time() * 1000)def _til_next_millis(self, last_timestamp):timestamp = self._current_milliseconds()while timestamp <= last_timestamp:timestamp = self._current_milliseconds()return timestampdef generate_id(self):with self.lock:timestamp = self._current_milliseconds()if timestamp < self.last_timestamp:raise ValueError("Clock moved backwards. Refusing to generate id.")if timestamp == self.last_timestamp:self.sequence = (self.sequence + 1) & self.max_sequenceif self.sequence == 0:timestamp = self._til_next_millis(self.last_timestamp)else:self.sequence = 0self.last_timestamp = timestampreturn ((timestamp - 1288834974657) << self.timestamp_shift) | \(self.datacenter_id << self.datacenter_id_shift) | \(self.worker_id << self.worker_id_shift) | \self.sequencedef generate_unique_id(prefix: str, datacenter_id: int, worker_id: int) -> str:generator = SnowflakeGenerator(datacenter_id, worker_id)snowflake_id = generator.generate_id()return f"{prefix}{snowflake_id}"

代码解析

  1. SnowflakeGenerator类

    • 初始化方法设置数据中心ID和工作机器ID,并定义各部分的位长度和最大值。
    • _current_milliseconds()方法获取当前时间戳(毫秒级)。
    • _til_next_millis()方法等待直到下一毫秒。
    • generate_id()方法是核心,它生成唯一的雪花ID。
  2. generate_id()方法

    • 使用锁确保线程安全。
    • 获取当前时间戳。
    • 处理时钟回拨问题(抛出异常)。
    • 处理同一毫秒内的序列号。
    • 组合各部分生成最终的ID。
  3. generate_unique_id()函数

    • 创建SnowflakeGenerator实例。
    • 生成雪花ID并添加前缀。

使用示例

# 创建一个生成器,指定数据中心ID和工作机器ID
datacenter_id = 1
worker_id = 1# 生成用户ID
user_id = generate_unique_id("USER_", datacenter_id, worker_id)
print(f"生成的用户ID: {user_id}")# 生成订单ID
order_id = generate_unique_id("ORDER_", datacenter_id, worker_id)
print(f"生成的订单ID: {order_id}")# 生成多个产品ID
for i in range(5):product_id = generate_unique_id("PROD_", datacenter_id, worker_id)print(f"产品 {i+1} ID: {product_id}")

输出可能如下:

生成的用户ID: USER_6791951648483729408
生成的订单ID: ORDER_6791951648483729409
产品 1 ID: PROD_6791951648483729410
产品 2 ID: PROD_6791951648483729411
产品 3 ID: PROD_6791951648483729412
产品 4 ID: PROD_6791951648483729413
产品 5 ID: PROD_6791951648483729414

优势

  1. 高性能:雪花算法可以快速生成ID,不需要网络请求或数据库操作。
  2. 唯一性:在正确配置的情况下,可以保证全局唯一性。
  3. 有序性:生成的ID大致按时间顺序递增,有利于数据库索引。
  4. 包含信息:ID中包含时间戳、数据中心和工作机器信息,便于追踪和调试。
  5. 可定制:可以根据需求调整各部分的位数。

注意事项

  1. 时钟同步:雪花算法依赖系统时钟,在分布式系统中需要确保时钟同步。
  2. 时钟回拨:代码中包含了对时钟回拨的处理,但在实际应用中可能需要更复杂的处理逻辑。
  3. 数据中心和工作机器ID:需要确保这些ID在整个分布式系统中是唯一的。
  4. 64位限制:如果使用的语言或系统不支持64位整数,可能需要调整算法。

适用场景

雪花算法特别适用于以下场景:

  • 分布式系统中需要生成全局唯一ID
  • 需要按时间顺序对数据进行排序
  • 高并发系统,需要快速生成大量唯一ID
  • 微服务架构,每个服务需要独立生成ID

结论

雪花算法提供了一种优雅的方式来在分布式系统中生成唯一ID。这个Python实现简单易用,同时保持了雪花算法的核心优势。在实际应用中,您可能需要根据具体需求进行进一步的调整和优化,例如处理时钟回拨的更复杂情况,或者调整各部分的位数分配。

通过使用这种方法,您可以在Python项目中轻松实现高效、唯一且信息丰富的ID生成。无论是用于用户ID、订单编号还是其他需要唯一标识符的场景,雪花算法都能提供可靠的解决方案。

相关文章:

使用雪花算法(Snowflake Algorithm)在Python中生成唯一ID

使用雪花算法Snowflake Algorithm在Python中生成唯一ID 使用雪花算法&#xff08;Snowflake Algorithm&#xff09;在Python中生成唯一ID雪花算法简介Python实现代码解析使用示例优势注意事项适用场景结论 使用雪花算法&#xff08;Snowflake Algorithm&#xff09;在Python中生…...

Docker期末复习

云计算服务类型有: IaaS 基础设施及服务 PaaS 平台及服务 SaaS 软件及服务 服务类型辨析示例: IaaS 服务提供的云服务器软件到操作系统,具体应用软件自己安装,如腾讯云上申请的云服务器等;SaaS提供的服务就是具体的软件,例如微软的Office套件等。 云计算部署模式有: 私有云…...

DP:子数组问题

文章目录 引言子数组问题介绍动态规划的基本概念具体问题的解决方法动态规划解法&#xff1a;关于子数组问题的几个题1.最大子数组和2.环形子数组的最大和3.乘积最大子数组4.乘积为正数的最长子数组长度5.等差数列划分 总结 引言 介绍动态规划&#xff08;DP&#xff09;在解决…...

[Day 20] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

AI在醫療領域的創新應用 隨著科技的快速發展&#xff0c;人工智能&#xff08;AI&#xff09;在各行各業的應用越來越廣泛&#xff0c;醫療領域也不例外。AI技術在醫療中的應用不僅提高了診斷的準確性&#xff0c;還改善了病患的治療效果&#xff0c;優化了醫療資源的配置。本…...

Handling `nil` Values in `NSDictionary` in Objective-C

Handling nil Values in NSDictionary in Objective-C When working with Objective-C, particularly when dealing with data returned from a server, it’s crucial (至关重要的) to handle nil values appropriately (适当地) to prevent unexpected crashes. Here, we ex…...

【深入浅出 】——【Python 字典】——【详解】

目录 1. 什么是 Python 字典&#xff1f; 1.1 字典的基本概念 1.2 字典的用途 1.3 字典的优势 2. 字典的基本特点 2.1 键的唯一性 2.2 可变性 2.3 无序性 3. 如何创建字典&#xff1f; 3.1 使用 {} 符号 3.2 使用 dict() 工厂方法 3.3 使用 fromkeys() 方法 4. 字…...

开发RpcProvider的发布服务(NotifyService)

1.发布服务过程 目前完成了mprpc框架项目中的以上的功能。 作为rpcprovider的使用者&#xff0c;也就是rpc方法的发布方 main函数如下&#xff1a; 首先我们init调用框架的init&#xff0c;然后启动一个provider&#xff0c;然后向provider上注册服务对象方法&#xff0c;即us…...

Suno: AI音乐创作的新时代

名人说:一点浩然气,千里快哉风。 ——苏轼 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、什么是Suno?1、Suno2、应用场景二、如何使用Suno制作音乐?步骤1:注册并登录Suno平台步骤2:创建音乐项目步骤3:生成音乐片段三、Suno的影响很高兴你打开了…...

六西格玛项目实战:数据驱动,手机PCM率直线下降

在当前智能手机市场日益竞争激烈的背景下&#xff0c;消费者对手机质量的要求达到了前所未有的高度。PCM&#xff08;可能指生产过程中的某种不良率或缺陷率&#xff09;作为影响手机质量的关键因素&#xff0c;直接关联到消费者满意度和品牌形象。为了应对这一挑战&#xff0c…...

数据结构递归(01)汉诺塔经典问题

说明&#xff1a;使用递归时&#xff0c;必须要遵守两个限制条件&#xff1a; 递归存在限制条件&#xff0c;满⾜这个限制条件时&#xff0c;递归不再继续&#xff1b; 每次递归调⽤之后越来越接近这个限制条件&#xff1b; 1 汉诺塔&#xff08;Hanoi Tower&#xff09;经典…...

计算机专业课面试常见问题-计算机网络篇

目录 1. 计算机网络分为哪 5 层&#xff1f; 2. TCP 协议简述&#xff1f; 3. TCP 和 UDP 的区别&#xff1f;->不同的应用场景&#xff1f; 4. 从浏览器输入网址到显示页…...

HarmonyOS ArkUi ArkWeb加载不出网页问题踩坑

使用 使用还是比较简单的&#xff0c;直接贴代码了 别忘了配置网络权限 Entry Component struct WebPage {State isAttachController: boolean falseState url: string State title: string Prop controller: web_webview.WebviewController new web_webview.WebviewCont…...

微信换手机号了怎么绑定新手机号?

微信换手机号了怎么绑定新手机号&#xff1f; 1、在手机上找到并打开微信&#xff1b; 2、打开微信后&#xff0c;点击底部我的&#xff0c;并进入微信设置&#xff1b; 3、在微信设置账号与安全内&#xff0c;找到手机号并点击进入&#xff1b; 4、选择更换手机号&#xff0c…...

64.WEB渗透测试-信息收集- WAF、框架组件识别(4)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;63.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;3&#xff09;-CSDN博客 我们在…...

java.lang.LinkageError: 链接错误的正确解决方法,亲测有效,嘿嘿,有效

文章目录 问题分析报错原因解决思路解决方法&#xff08;含代码示例&#xff09;1. 检查类加载器2. 避免在运行时修改类定义3. 更新或修复 JVM4. 检查应用程序的依赖使用 Maven 检查依赖项使用 Gradle 检查依赖项 java.lang.LinkageError 是 Java 虚拟机在尝试链接类定义时发生…...

python最基础

基本的类 python最基础、最常用的类主要有int整形&#xff0c;float浮点型&#xff0c;str字符串&#xff0c;list列表&#xff0c;dict字典&#xff0c;set集合&#xff0c;tuple元组等等。int整形、float浮点型一般用于给变量赋值&#xff0c;tuple元组属于不可变对象&#…...

Python学习路线图(2024最新版)

这是我最开始学Python时的一套学习路线&#xff0c;从入门到上手。&#xff08;不敢说精通&#xff0c;哈哈~&#xff09; 一、Python基础知识、变量、数据类型 二、Python条件结构、循环结构 三、Python函数 四、字符串 五、列表与元组 六、字典与集合 最后再送给大家一套免费…...

66、基于长短期记忆 (LSTM) 网络对序列数据进行分类

1、基于长短期记忆 (LSTM) 网络对序列数据进行分类的原理及流程 基于长短期记忆&#xff08;LSTM&#xff09;网络对序列数据进行分类是一种常见的深度学习任务&#xff0c;适用于处理具有时间或序列关系的数据。下面是在Matlab中使用LSTM网络对序列数据进行分类的基本原理和流…...

RabbitMQ消息可靠性等机制详解(精细版三)

目录 七 RabbitMQ的其他操作 7.1 消息的可靠性(发送可靠) 7.1.1 confim机制(保证发送可靠) 7.1.2 Return机制(保证发送可靠) 7.1.3 编写配置文件 7.1.4 开启Confirm和Return 7.2 手动Ack(保证接收可靠) 7.2.1 添加配置文件 7.2.2 手动ack 7.3 避免消息重复消费 7.3.…...

88888

49615...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...