详细分析Python模块中的雪花算法(附模板)

目录

  • 前言
  • 1. 基本知识
  • 2. 模板
  • 3. Demo

前言

分布式ID的生成推荐阅读:分布式ID生成方法的超详细分析(全)

1. 基本知识

Snowflake 算法是一种用于生成全局唯一 ID 的分布式算法,最初由 Twitter 设计并开源

它被设计用于解决分布式系统中生成唯一 ID 的需求,特别是在微服务架构和大规模分布式系统中

Snowflake 算法的核心思想是利用时间戳、工作机器 ID 和序列号来生成全局唯一的 64 位长整型 ID

其核心的组成部分如下:

  • 时间戳(Timestamp):通常以毫秒为单位,用于标识生成 ID 的时间点。时间戳的精度对 ID 的唯一性至关重要

  • 工作机器 ID(Worker ID):用于标识不同的工作机器或节点。在分布式系统中,每个节点需要有唯一的标识

  • 数据中心 ID(Datacenter ID):用于标识不同的数据中心。在大规模分布式系统中,可能存在多个数据中心,每个数据中心需要有唯一的标识

  • 序列号(Sequence Number):用于解决同一时间戳下生成多个 ID 的冲突问题。序列号通常是一个自增的数字,通过与一定的位数掩码进行位运算来确保不会溢出

Snowflake 算法的作用:

  • 生成全局唯一 ID:Snowflake 算法可以在分布式系统中生成全局唯一的 ID,确保不同节点生成的 ID 不会冲突

  • 适用于分布式环境:由于Snowflake算法只依赖于机器的时钟和网络通信,因此非常适合在分布式环境中使用

  • 简单且高效:Snowflake 算法的实现相对简单,且性能高效,可以快速生成唯一 ID

2. 模板

以下模板带有注释

实现了一个 Snowflake 类,通过调用 generate 方法可以生成唯一的 Snowflake ID

Snowflake ID 是一个 64 位长整型,包含了时间戳、数据中心 ID、工作机器 ID 和序列号等信息

import timeclass SnowFlake(object):def __init__(self, worker_id, datacenter_id, sequence=0):self.worker_id = worker_id  # 用于标识不同的工作机器self.datacenter_id = datacenter_id  # 用于标识不同的数据中心self.sequence = sequence  # 序列号,用于解决并发生成的 ID 冲突self.tw_epoch = 1288834974657  # Twitter Snowflake epoch (in milliseconds),Snowflake 算法的起始时间点# Bit lengths,用于计算位数self.worker_id_bits = 5  # 5位,最大值为31self.datacenter_id_bits = 5  # 5位,最大值为31self.max_worker_id = -1 ^ (-1 << self.worker_id_bits)  # 最大工作机器 IDself.max_datacenter_id = -1 ^ (-1 << self.datacenter_id_bits)  # 最大数据中心 IDself.sequence_bits = 12  # 12位,支持的最大序列号数self.sequence_mask = -1 ^ (-1 << self.sequence_bits)  # 序列号掩码,用于生成序列号# Create initial timestamp,初始化上一次生成 ID 的时间戳self.last_timestamp = self.current_timestamp()# Check worker_id and datacenter_id values,检查工作机器 ID 和数据中心 ID 的取值范围if self.worker_id > self.max_worker_id or self.worker_id < 0:raise ValueError(f"Worker ID must be between 0 and {self.max_worker_id}")if self.datacenter_id > self.max_datacenter_id or self.datacenter_id < 0:raise ValueError(f"Datacenter ID must be between 0 and {self.max_datacenter_id}")@staticmethoddef current_timestamp():return int(time.time() * 1000)  # 获取当前时间戳,单位为毫秒def generate(self):timestamp = self.current_timestamp()  # 获取当前时间戳if timestamp < self.last_timestamp:  # 如果当前时间戳小于上一次生成 ID 的时间戳raise ValueError("Clock moved backwards. Refusing to generate ID for {} milliseconds".format(self.last_timestamp - timestamp))  # 抛出异常,时钟回拨if timestamp == self.last_timestamp:  # 如果当前时间戳等于上一次生成 ID 的时间戳self.sequence = (self.sequence + 1) & self.sequence_mask  # 增加序列号,并与序列号掩码进行与运算,防止溢出if self.sequence == 0:  # 如果序列号归零timestamp = self.wait_next_millis(self.last_timestamp)  # 等待下一毫秒else:self.sequence = 0  # 时间戳变化,序列号重置为零self.last_timestamp = timestamp  # 更新上一次生成 ID 的时间戳# Generate Snowflake ID,生成 Snowflake ID_id = ((timestamp - self.tw_epoch) << (self.worker_id_bits + self.datacenter_id_bits)) | (self.datacenter_id << self.worker_id_bits) | self.worker_id << self.sequence_bits | self.sequence  # 使用时间戳、数据中心 ID、工作机器 ID 和序列号生成 IDreturn f"{_id:016d}"  # 返回 64 位长整型 ID 的字符串表示,补齐到16位长度def wait_next_millis(self, last_timestamp):timestamp = self.current_timestamp()  # 获取当前时间戳while timestamp <= last_timestamp:  # 循环直到获取到下一毫秒的时间戳timestamp = self.current_timestamp()return timestamp  # 返回下一毫秒的时间戳

3. Demo

结合以上模板,放一个调用的过程:

# 示例用法
if __name__ == "__main__":# 假设有两个数据中心,每个数据中心有两个工作机器worker_id = 1datacenter_id = 1snowflake = SnowFlake(worker_id, datacenter_id)# 生成10个IDfor i in range(10):print(snowflake.generate())

截图如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/280107.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【5G NB-IoT NTN】3GPP R17 NB-IoT NTN介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

学生信息管理系统--修改信息(非常详细的修改,更新,撤销,删除逻辑)

目录 概述修改包括的操作修改在每个模块中的应用 详解修改与更新取消删除 特殊概念数据集游标 总结 概述 学生信息管理系统&#xff0c;功能相对简单且代码重复性高&#xff0c;应该采用复用的思想来减少代码的冗余和提高代码的可维护性。然而&#xff0c;对于基础入门项目来说…

wireshark数据捕获实验简述

Wireshark是一款开源的网络协议分析工具&#xff0c;它可以用于捕获和分析网络数据包。是一款很受欢迎的“网络显微镜”。 实验拓扑图&#xff1a; 实验基础配置&#xff1a; 服务器&#xff1a; ip:172.16.1.88 mask:255.255.255.0 r1: sys sysname r1 undo info enable in…

一文读懂!Mj AI作画是什么?5款Midjourney国内版软件必备!

mj ai 作画是什么&#xff1f; mj ai 作画&#xff0c;是 Midjourney ai 作画的缩写&#xff0c;这里的 Midjourney 是海外一款非常出名的 AI 绘画软件&#xff0c;其受欢迎程度和影响力之广&#xff0c;某种程度上让它成了 AI 作画的代名词&#xff0c;正如 ps 在平面设计领域…

D-Star 寻路算法

D-Star 寻路算法 下面简写 D-Star 为 D* D算法&#xff1a;D 算法”的名称源自 Dynamic A Star,最初由Anthony Stentz于“Optimal and Efficient Path Planning for Partially-Known Environments”中介绍。它是一种启发式的路径搜索算法&#xff0c; 适合面对周围环境未知或者…

静态代理IP测试:有何优点?

随着互联网的普及&#xff0c;越来越多的人开始使用动态IP进行上网。但是在某些情况下&#xff0c;我们可能需要使用静态IP进行测试或特定的网络设置。本文将介绍如何获取静态IP进行测试以及静态IP的优点。 一、如何获取静态IP进行测试&#xff1f; 1.联系ISP&#xff08;Int…

Docker Desktop 安装 ClickHouse 超级简单教程

Docker desktop 安装 clickhouse 超级简单 文章目录 Docker desktop 安装 clickhouse 超级简单 什么是 Docker &#xff1f;安装下准备安装Docker配置安装 ClickHouse配置数据库密码DBeaver 测试创建表总结 什么是 Docker &#xff1f; 下载 Docker desktop Docker Desktop …

红外相机和RGB相机标定:实现两种模态数据融合

1. 前期准备 RGB相机&#xff1a;森云智能SG2-IMX390&#xff0c;1个红外相机&#xff1a;艾睿光电IR-Pilot 640X-32G&#xff0c;1个红外标定板&#xff1a;https://item.taobao.com/item.htm?_ujp3fdd12b99&id644506141871&spma1z09.2.0.0.5f822e8dKrxxYI 2.操作步…

Spring MVC开发小练习

1. 加法计算器 需求&#xff1a;输入两个整数&#xff0c;计算和 约定前后端交互接口&#xff1a; 在开发项目前&#xff0c;根据需求先约定好前后端交互接口&#xff0c;双方按照接口文档进行开发&#xff0c;接口文档一旦写好&#xff0c;尽量不要轻易改变&#xff0c;如果…

CPU设计实战-Wishbone总线接口

为什么需要改用总线接口&#xff1f; 1.但是在实际应用中&#xff0c;程序的体积可能非常大&#xff0c;指令存储器就不能再集成在FPGA内部了&#xff0c;一般使用FPGA芯片外部的Flash作为指令存储器。同理,-般使用FPGA芯片外部的SDRAM作为数据存储器。 2.统一接口标准。 很多…

蓝桥杯 2023 省B 飞机降落

首先&#xff0c;这题要求的数据量比较少&#xff0c;我们可以考虑考虑暴力解法。 这题可能难在很多情况的考虑&#xff0c;比如说&#xff1a; 现在时间是10&#xff0c;有个飞机20才到&#xff0c;我们是可以干等10分钟。 #include <iostream> #include <…

0101插入排序-算法基础-算法导论第三版

文章目录 一 插入排序二 循环不变式与插入排序的正确性三 伪代码中的一些约定四 Java代码实现插入排序结语 一 插入排序 输入&#xff1a; n n n个数订单一个序列 ( a 1 , a 2 , ⋯ , a n ) (a_1,a_2,\cdots,a_n) (a1​,a2​,⋯,an​). **输出&#xff1a;**输入序列的一个排…

OpenWRT+zeroTier旁路由组网

前言 我之前写过一篇文章&#xff0c;探究了zeroTier的最基础的玩法&#xff0c;那篇文章结尾我提到了使用zeroTier虽然实现组网了&#xff0c;但是我只能访问局域网中制定的设备&#xff0c;局域网中其他设备无法访问&#xff0c;这篇文章我又研究了一套方案openwrtzeroTier旁…

IEEE Transactions on Medical Imaging(TMI)论文推荐:2024年01月(1)

Unsupervised Domain Adaptation for Medical Image Segmentation by Disentanglement Learning and Self-Training 摘要&#xff1a;无监督域适应(Unsupervised domain adaptive, UDA)旨在提高深度模型在无标记数据上的分割性能&#xff0c;近年来受到广泛关注。在本文中&…

el-input设置max、min无效的解决方案

目录 一、方式1&#xff1a;type“number” 二、方式2&#xff1a;oninput&#xff08;推荐&#xff09; 三、计算属性 如下表所示&#xff0c;下面为官方关于max&#xff0c;min的介绍&#xff1a; el-input&#xff1a; max原生属性&#xff0c;设置最大值min原生属性&a…

如何在 Linux ubuntu 系统上搭建 Java web 程序的运行环境

如何在 Linux ubuntu 系统上搭建 Java web 程序的运行环境 基于包管理器进行安装 Linux 会把一些软件包放到对应的服务器上&#xff0c;通过包管理器这样的程序&#xff0c;来把这些软件包给下载安装 ubuntu系统上的包管理器是 apt centos系统上的包管理器 yum 注&#xff1a;…

前缀和算法

前缀和可以快速求出数组中某个连续区间的和 预处理出来一个前缀和数组 为了处理边界情况,下标从1开始 dp[i]表示原数组[ 1 , i ]区间内所有元素之和 dp[i]dp[i-1]原数组[i] 使用前缀和数组 文章目录 【模板】前缀和【模板】二维前缀和寻找数组的中心下标除自身以外数组的乘积…

打卡学习kubernetes——了解k8s基本概念

目录 1 Container 2 Pod 3 Node 4 Namespace 5 Service 6 Label 7 Annotations 8 Volume 1 Container Container(容器)是一种便携式、轻量级的操作系统级虚拟化技术。它使用namespace隔离不同的软件运行环境&#xff0c;并通过镜像自包含软件的运行环境&#xff0c;从而…

关于继承是怎么样的?那当然是很好理解之

本文描述了关于继承的大部分知识&#xff0c;但是并不全&#xff0c;每篇博客之间的知识都有互串&#xff0c;所以需要把几篇文章合起来看&#xff0c;学会融会贯通&#xff01; 温馨提示&#xff1a;使用PC端观看&#xff0c;效果更佳&#xff01; 目录 1.继承是什么 2.什…

机器学习是什么?

机器学习是一种人工智能&#xff08;AI&#xff09;的分支&#xff0c;其主要目标是使计算机系统能够通过数据和经验来改进和学习&#xff0c;而无需明确地编程。在机器学习中&#xff0c;计算机系统会通过对大量数据进行学习和分析&#xff0c;从中发现模式和规律&#xff0c;…