使用雪花算法(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}"
代码解析
-
SnowflakeGenerator类:
- 初始化方法设置数据中心ID和工作机器ID,并定义各部分的位长度和最大值。
_current_milliseconds()方法获取当前时间戳(毫秒级)。_til_next_millis()方法等待直到下一毫秒。generate_id()方法是核心,它生成唯一的雪花ID。
-
generate_id()方法:
- 使用锁确保线程安全。
- 获取当前时间戳。
- 处理时钟回拨问题(抛出异常)。
- 处理同一毫秒内的序列号。
- 组合各部分生成最终的ID。
-
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
优势
- 高性能:雪花算法可以快速生成ID,不需要网络请求或数据库操作。
- 唯一性:在正确配置的情况下,可以保证全局唯一性。
- 有序性:生成的ID大致按时间顺序递增,有利于数据库索引。
- 包含信息:ID中包含时间戳、数据中心和工作机器信息,便于追踪和调试。
- 可定制:可以根据需求调整各部分的位数。
注意事项
- 时钟同步:雪花算法依赖系统时钟,在分布式系统中需要确保时钟同步。
- 时钟回拨:代码中包含了对时钟回拨的处理,但在实际应用中可能需要更复杂的处理逻辑。
- 数据中心和工作机器ID:需要确保这些ID在整个分布式系统中是唯一的。
- 64位限制:如果使用的语言或系统不支持64位整数,可能需要调整算法。
适用场景
雪花算法特别适用于以下场景:
- 分布式系统中需要生成全局唯一ID
- 需要按时间顺序对数据进行排序
- 高并发系统,需要快速生成大量唯一ID
- 微服务架构,每个服务需要独立生成ID
结论
雪花算法提供了一种优雅的方式来在分布式系统中生成唯一ID。这个Python实现简单易用,同时保持了雪花算法的核心优势。在实际应用中,您可能需要根据具体需求进行进一步的调整和优化,例如处理时钟回拨的更复杂情况,或者调整各部分的位数分配。
通过使用这种方法,您可以在Python项目中轻松实现高效、唯一且信息丰富的ID生成。无论是用于用户ID、订单编号还是其他需要唯一标识符的场景,雪花算法都能提供可靠的解决方案。
相关文章:
使用雪花算法(Snowflake Algorithm)在Python中生成唯一ID
使用雪花算法Snowflake Algorithm在Python中生成唯一ID 使用雪花算法(Snowflake Algorithm)在Python中生成唯一ID雪花算法简介Python实现代码解析使用示例优势注意事项适用场景结论 使用雪花算法(Snowflake Algorithm)在Python中生…...
Docker期末复习
云计算服务类型有: IaaS 基础设施及服务 PaaS 平台及服务 SaaS 软件及服务 服务类型辨析示例: IaaS 服务提供的云服务器软件到操作系统,具体应用软件自己安装,如腾讯云上申请的云服务器等;SaaS提供的服务就是具体的软件,例如微软的Office套件等。 云计算部署模式有: 私有云…...
DP:子数组问题
文章目录 引言子数组问题介绍动态规划的基本概念具体问题的解决方法动态规划解法:关于子数组问题的几个题1.最大子数组和2.环形子数组的最大和3.乘积最大子数组4.乘积为正数的最长子数组长度5.等差数列划分 总结 引言 介绍动态规划(DP)在解决…...
[Day 20] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
AI在醫療領域的創新應用 隨著科技的快速發展,人工智能(AI)在各行各業的應用越來越廣泛,醫療領域也不例外。AI技術在醫療中的應用不僅提高了診斷的準確性,還改善了病患的治療效果,優化了醫療資源的配置。本…...
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 字典? 1.1 字典的基本概念 1.2 字典的用途 1.3 字典的优势 2. 字典的基本特点 2.1 键的唯一性 2.2 可变性 2.3 无序性 3. 如何创建字典? 3.1 使用 {} 符号 3.2 使用 dict() 工厂方法 3.3 使用 fromkeys() 方法 4. 字…...
开发RpcProvider的发布服务(NotifyService)
1.发布服务过程 目前完成了mprpc框架项目中的以上的功能。 作为rpcprovider的使用者,也就是rpc方法的发布方 main函数如下: 首先我们init调用框架的init,然后启动一个provider,然后向provider上注册服务对象方法,即us…...
Suno: AI音乐创作的新时代
名人说:一点浩然气,千里快哉风。 ——苏轼 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、什么是Suno?1、Suno2、应用场景二、如何使用Suno制作音乐?步骤1:注册并登录Suno平台步骤2:创建音乐项目步骤3:生成音乐片段三、Suno的影响很高兴你打开了…...
六西格玛项目实战:数据驱动,手机PCM率直线下降
在当前智能手机市场日益竞争激烈的背景下,消费者对手机质量的要求达到了前所未有的高度。PCM(可能指生产过程中的某种不良率或缺陷率)作为影响手机质量的关键因素,直接关联到消费者满意度和品牌形象。为了应对这一挑战,…...
数据结构递归(01)汉诺塔经典问题
说明:使用递归时,必须要遵守两个限制条件: 递归存在限制条件,满⾜这个限制条件时,递归不再继续; 每次递归调⽤之后越来越接近这个限制条件; 1 汉诺塔(Hanoi Tower)经典…...
计算机专业课面试常见问题-计算机网络篇
目录 1. 计算机网络分为哪 5 层? 2. TCP 协议简述? 3. TCP 和 UDP 的区别?->不同的应用场景? 4. 从浏览器输入网址到显示页…...
HarmonyOS ArkUi ArkWeb加载不出网页问题踩坑
使用 使用还是比较简单的,直接贴代码了 别忘了配置网络权限 Entry Component struct WebPage {State isAttachController: boolean falseState url: string State title: string Prop controller: web_webview.WebviewController new web_webview.WebviewCont…...
微信换手机号了怎么绑定新手机号?
微信换手机号了怎么绑定新手机号? 1、在手机上找到并打开微信; 2、打开微信后,点击底部我的,并进入微信设置; 3、在微信设置账号与安全内,找到手机号并点击进入; 4、选择更换手机号,…...
64.WEB渗透测试-信息收集- WAF、框架组件识别(4)
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:63.WEB渗透测试-信息收集- WAF、框架组件识别(3)-CSDN博客 我们在…...
java.lang.LinkageError: 链接错误的正确解决方法,亲测有效,嘿嘿,有效
文章目录 问题分析报错原因解决思路解决方法(含代码示例)1. 检查类加载器2. 避免在运行时修改类定义3. 更新或修复 JVM4. 检查应用程序的依赖使用 Maven 检查依赖项使用 Gradle 检查依赖项 java.lang.LinkageError 是 Java 虚拟机在尝试链接类定义时发生…...
python最基础
基本的类 python最基础、最常用的类主要有int整形,float浮点型,str字符串,list列表,dict字典,set集合,tuple元组等等。int整形、float浮点型一般用于给变量赋值,tuple元组属于不可变对象&#…...
Python学习路线图(2024最新版)
这是我最开始学Python时的一套学习路线,从入门到上手。(不敢说精通,哈哈~) 一、Python基础知识、变量、数据类型 二、Python条件结构、循环结构 三、Python函数 四、字符串 五、列表与元组 六、字典与集合 最后再送给大家一套免费…...
66、基于长短期记忆 (LSTM) 网络对序列数据进行分类
1、基于长短期记忆 (LSTM) 网络对序列数据进行分类的原理及流程 基于长短期记忆(LSTM)网络对序列数据进行分类是一种常见的深度学习任务,适用于处理具有时间或序列关系的数据。下面是在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...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
