雪花算法(Snowflake Algorithm)是一种用于生成唯一的ID的算法,它由Twitter开发。其生成的ID在全局范围内是唯一的,适合高并发场景。雪花算法生成的ID通常是一个64位的整数,包含多个部分,具体结构如下:

1. **时间戳(41位)**:当前时间的毫秒数,能支持69年的时间范围。
2. **工作机器ID(10位)**:机器ID,可以支持1024台机器。
3. **数据中心ID(10位)**:数据中心ID,支持1024个数据中心。
4. **序列号(12位)**:在同一毫秒内生成的ID序列号,支持每毫秒生成4096个ID。

以下是一个用Python实现的雪花算法的代码示例,附带注释:

import time
import threading class Snowflake:
# 基本参数
epoch = 1609459200000 # 自定义的开始时间(2021-01-01 00:00:00)
worker_id_bits = 10 # 工作机器ID占用的位数
datacenter_id_bits = 10 # 数据中心ID占用的位数
sequence_bits = 12 # 序列号占用的位数 # 计算各部分的位移
worker_id_shift = sequence_bits # 序列号位移
datacenter_id_shift = sequence_bits + worker_id_bits # 数据中心ID位移
timestamp_shift = sequence_bits + worker_id_bits + datacenter_id_bits # 时间戳位移 # 生成掩码
max_worker_id = -1 ^ (-1 << worker_id_bits) # 计算最大工作机器ID
max_datacenter_id = -1 ^ (-1 << datacenter_id_bits) # 计算最大数据中心ID
sequence_mask = -1 ^ (-1 << sequence_bits) # 计算序列号掩码 def __init__(self, worker_id, datacenter_id):
if worker_id > self.max_worker_id or worker_id < 0:
raise ValueError(f'worker_id必须在0到{self.max_worker_id}之间')
if datacenter_id > self.max_datacenter_id or datacenter_id < 0:
raise ValueError(f'datacenter_id必须在0到{self.max_datacenter_id}之间') self.worker_id = worker_id
self.datacenter_id = datacenter_id
self.sequence = 0 # 序列号初始值
self.last_timestamp = -1 # 上一次生成ID的时间戳 def _current_time_millis(self):
return int(time.time() * 1000) # 获取当前时间戳(毫秒) def generate_id(self):
timestamp = self._current_time_millis() # 获取当前时间戳 if timestamp < self.last_timestamp:
raise Exception('时钟向后移动,无法生成ID') if self.last_timestamp == timestamp:
self.sequence = (self.sequence + 1) & self.sequence_mask # 在同一毫秒内序列号加1
if self.sequence == 0:
# 序列号已满,等待下一毫秒
while timestamp <= self.last_timestamp:
timestamp = self._current_time_millis()
else:
self.sequence = 0 # 重置序列号 self.last_timestamp = timestamp # 更新上一次时间戳 # 生成ID
id = ((timestamp - self.epoch) << self.timestamp_shift) | \
(self.datacenter_id << self.datacenter_id_shift) | \
(self.worker_id << self.worker_id_shift) | \
self.sequence
return id # 示例:创建一个雪花算法实例并生成ID
if __name__ == "__main__":
worker_id = 1 # 机器ID
datacenter_id = 1 # 数据中心ID
snowflake = Snowflake(worker_id, datacenter_id) # 生成10个ID
for _ in range(10):
print(snowflake.generate_id())

### 代码说明:
- **Snowflake 类**:主要实现雪花算法的逻辑。
- **__init__ 方法**:初始化机器ID和数据中心ID,检查其合法性。
- **_current_time_millis 方法**:获取当前时间的毫秒数。
- **generate_id 方法**:生成唯一的ID,处理序列号的自增和时间戳的更新。
- **主程序**:创建一个 `Snowflake` 实例并生成10个唯一的ID。

这种算法适合分布式系统中生成唯一标识符,确保在高并发的情况下仍然能生成不重复的ID。

更多实用教程资源:http://sj.ysok.net/jydoraemon 访问码:JYAM

python雪花算法的更多相关文章

  1. 开源一个比雪花算法更好用的ID生成算法(雪花漂移)

    比雪花算法更好用的ID生成算法(单机或分布式唯一ID) 转载及版权声明 本人从未在博客园之外的网站,发表过本算法长文,其它网站所现文章,均属他人拷贝之作. 所有拷贝之作,均须保留项目开源链接,否则禁止 ...

  2. Python基础算法综合:加减乘除四则运算方法

    #!usr/bin/env python# -*- coding:utf-8 -*-#python的算法加减乘除用符号:+,-,*,/来表示#以下全是python2.x写法,3.x以上请在python ...

  3. xsank的快餐 » Python simhash算法解决字符串相似问题

    xsank的快餐 » Python simhash算法解决字符串相似问题 Python simhash算法解决字符串相似问题

  4. Snowflake(雪花算法)的JavaScript实现

    现在好多的ID都是服务器端生成的,当然JS也可以生成GUID或者UUID之类的,但是如果想要有序……这时就想到了雪花算法,但是都知道JS中Number的最大值为Number.MAX_SAFE_INTE ...

  5. ID 生成器 雪花算法

    https://blog.csdn.net/wangming520liwei/article/details/80843248 ID 生成器 雪花算法 2018年06月28日 14:58:43 wan ...

  6. 分布式系统-主键唯一id,订单编号生成-雪花算法-SnowFlake

    分布式系统下 我们每台设备(分布式系统-独立的应用空间-或者docker环境) * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作 ...

  7. 分布式Snowflake雪花算法

    前言 项目中主键ID生成方式比较多,但是哪种方式更能提高的我们的工作效率.项目质量.代码实用性以及健壮性呢,下面作了一下比较,目前雪花算法的优点还是很明显的. 优缺点比较 UUID(缺点:太长.没法排 ...

  8. 一个类似 Twitter 雪花算法 的 连续序号 ID 产生器 SeqIDGenerator

    项目地址 :     https://github.com/kelin-xycs/SeqIDGenerator 今天 QQ 群 里有网友问起产生唯一 ID 的方法 有哪些,  讨论了各种方法 . 有网 ...

  9. 雪花算法(snowflake)delphi版

    雪花算法简单描述: + 最高位是符号位,始终为0,不可用. + 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一个很重要的作用是可以根据时间进行排序. + 10位的机器标识,1 ...

  10. mybatis plus 主键生成 Twitter雪花算法 id 及修改id为字符型

    mybatis plus配置主键生成策略为2,就是 使用Twitter雪花算法 生成id spring boot中配置为: GlobalConfiguration conf = new GlobalC ...

随机推荐

  1. 2024.09.18初赛模拟MX-S/P6029记录

    MX-S 太简单了,没啥难度.\yiw $ 1, 3, 5, 7, 9 $ 的二叉搜索树棵数是卡特兰数. P6029 题意 给定一张有 $ n $ 个点,$ m $ 条边的图.可以任意交换途中两条边的 ...

  2. @RestController和@Controller的区别

    @RestController 和 @Controller 是Spring框架中用于定义控制器(Controller)的两个非常重要的注解,它们都用于处理HTTP请求,但它们之间存在一些关键的区别. ...

  3. [TK] 盖房子 hzoi-tg#262

    同机房大佬也写了这题的 题解. 通解分析 此类问题我通常喜欢归纳成一类,即阻碍联通的坐标DP. 既然是阻碍联通,那么此类问题的通用思路是这样的: 首先将dp数组图形化. 一般用一个特定图形上的特定点来 ...

  4. T3 出行云原生容器化平台实践

    公司简介 T3 出行是南京领行科技股份有限公司打造的智慧出行生态平台,由中国第一汽车集团有限公司.东风汽车集团有限公司.重庆长安汽车股份有限公司发起,联合腾讯.阿里巴巴等互联网企业共同投资打造.公司以 ...

  5. 云原生爱好者周刊:使用 Cilium 和 Grafana 实现无侵入可观测性

    开源项目推荐 Cilium Grafana Observability Demo 这个项目由 Cilium 母公司 Isovalent 开源,提供了一个 Demo,使用 Cilium.OpenTele ...

  6. 强化学习算法笔记之【DDPG算法】

    强化学习笔记之[DDPG算法] 目录 强化学习笔记之[DDPG算法] 前言: 原论文伪代码 DDPG 中的四个网络 代码核心更新公式 前言: 本文为强化学习笔记第二篇,第一篇讲的是Q-learning ...

  7. Centos7安装Mysql5.7.42

    安装前的清理 查看是否安装了Mysql版本 [root@localhost ~]# yum list installed mysql* [root@localhost ~]# rpm –qa|grep ...

  8. 为什么我越来越喜欢用DDD — DDD架构篇(1)

    Hello DDD DDD 是一种软件设计方法,DDD 是指导我们做软件工程设计的一种手段.它提供了用切割工程模型的各类技巧,如:领域.界限上下文.实体.值对象.聚合.工厂.仓储等.通过 DDD 的指 ...

  9. 访问浪潮带外BMC界面的远程控制台重定向(KVM)无法访问,提示JViewer未签名,mac电脑安装JDK8

    报错截图: 安装JDK8 下载JDK1.8的安装包 Java Downloads | Oracle 下载的安装包双击按提示流程安装: 按照完成以后.我们可以查看JDK的安装路径.在资源库/Librar ...

  10. java根据时区转换获取时间的方法

    方法一: public static void main(String[] args) { // 假设这是从MySQL获取的UTC时间字符串 String utcTimeStr = "202 ...