分布式ID生成算法:雪花算法和UUID

news2025/4/19 19:56:43

        在分布式系统中,生成全局唯一ID是核心需求之一。雪花算法和UUID是两种广泛使用的解决方案。

1. 雪花算法

工作原理

  • 分布式ID生成器:由Twitter开源,专为分布式系统设计。
  • 组成结构(64位二进制):
    • 符号位(1位):固定为0,保证ID为正数。
    • 时间戳(41位):当前时间与自定义起始时间(如Twitter的2010-01-01)的毫秒差值,精确到毫秒级,可用约69年。
    • 工作节点ID(10位):可配置的机器或进程标识,支持最多1024个节点。
    • 序列号(12位):同一毫秒内的自增序号,支持每节点每毫秒生成4096个ID。
  • 工作原理:
    • 时间戳递增:每次生成ID时获取当前时间戳,若与上次相同,则递增序列号。
    • 处理并发:若序列号用尽(达到4096),则等待至下一毫秒再重置序列号。
    • 时钟回拨问题:若系统时间回退,可能导致ID冲突。常见解决方案:
      • 短暂回拨:等待时间恢复。
      • 严重回拨:抛出异常或扩展时间戳位数记录回拨次数。
  • 特点:
    • 趋势递增:时间戳在高位,生成的ID整体按时间递增,有利于数据库索引优化。
    • 依赖时钟:强依赖系统时钟,时钟回拨可能导致ID冲突。

适用场景​​​​​

  • 需要有序ID的场景:
    • 数据库主键(如MySQL InnoDB的聚簇索引)。
    • 时序数据存储(如日志、监控数据)。
  • 分布式系统:
    • 微服务架构下的订单ID、支付流水号。
    • 需要高吞吐量的ID生成(每秒百万级)。
  • 存储敏感场景:
    • ​​​​​​​要求ID尽可能短(如短链服务、二维码标识)。

2. UUID

  • 通用唯一标识符:标准化由RFC 4122定义,无需中心化协调。
  • 常见版本:
    • ​​​​​​​UUIDv1:基于时间戳和MAC地址生成,可能暴露隐私信息。
    • UUIDv4:完全随机生成(122位随机性),冲突概率极低(约需生成约2.6×10^18个UUID才有1%的冲突概率)。
    • UUIDv5/UUIDv3:基于命名空间和哈希算法(如SHA-1或MD5)。
  • 组成结构(128位,36字符字符串):
    • ​​​​​​​示例:123e4567-e89b-12d3-a456-426614174000
  • 工作原理:
    • ​​​​​​​UUIDv1:结合时间戳、节点MAC和随机数,确保时空唯一性。
    • UUIDv4:依赖强随机数生成器(如加密算法),重复概率极低(约10^37分之一)。
  • 优点:
    • ​​​​​​​去中心化:无需节点协调,节点生成简单。
    • 高唯一性:128位空间,重复概率极低。
  • 缺点:
    • ​​​​​​​无序性:随机生成的ID导致数据库索引分裂,影响写入性能。
    • 存储成本高:128位(16字节)是Snowflake的两倍。
    • 信息泄露风险:可能暴露MAC地址和生成时间。

适用场景

  • 去中心化生成:
    • ​​​​​​​客户端生成的临时标识(如文件上传令牌、浏览器Cookie)。
    • 无需服务端协调的多节点系统。
  • 隐私要求低:
    • ​​​​​​​内部系统日志追踪(使用UUIDv4)。
    • 非敏感资源的唯一标识(如图片存储key)。
  • 兼容性低:
    • ​​​​​​​跨语言、跨平台系统(UUID是通用标准)。

3. 雪花算法 VS UUID​​​​​​​

特性雪花算法UUID
长度64位(短,存储高效)128位(长,占用更多空间)
有序性时间戳有序,适合范围查询完全无序,索引效率低
生成方式依赖时钟和节点配置本地生成,无需协调
冲突概率理论上无冲突(时钟正常时)极低,但非绝对为零
隐私风险UUIDv1可能暴露MAC地址和时间信息
时钟依赖严重依赖时钟,回拨会导致问题无依赖(除UUIDv1)
适用场景高并发分布式系统(如订单、日志)无需协调的临时标识(如会话ID)

3.1 如何选择

  • 选择雪花算法:
    • ​​​​​​​需要有序ID以优化数据库性能。
    • 对存储和传输效率敏感(如海量数据场景)。
    • 能接受节点ID管理和时钟回拨处理成本。
  • 选择UUID:
    • 无需有效性,追求简单实现和去中心化
    • 接受存储开销,且不依赖高并发索引(如文件ID、临时令牌)。
    • 优先使用UUIDv4以避免MAC泄露风险。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高效查询Redis中大数据的实践与优化指南

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱个人微信&a…

操作系统 4.2-键盘

键盘中断初始化和处理 提取的代码如下: // con_init 函数,初始化控制台(包括键盘)的中断 void con_init(void) {set_trap_gate(0x21, &keyboard_interrupt); } ​ // 键盘中断处理函数 .globl _keyboard_interrupt _keyboard…

STM32+EC600E 4G模块 与华为云平台通信

前言 由于在STM32巡回研讨会上淘了一块EC600E4G模块以及刚办完电信卡多了两张副卡,副卡有流量刚好可以用一下,试想着以后画一块ESP32板子搭配这个4G模块做个随身WIFI,目前先用这个模块搭配STM32玩一下云平顺便记录一下。 实验目的 实现STM…

进行性核上性麻痹患者,饮食 “稳” 健康

进行性核上性麻痹作为一种复杂且罕见的神经系统退行性疾病,给患者的身体机能和日常生活带来严重挑战。在积极接受专业治疗的同时,合理的饮食安排对于维持患者营养状况、缓解症状及提升生活质量起着关键作用。以下为患者提供一些健康饮食建议。 首先&…

【数据结构 · 初阶】- 顺序表

目录 一、线性表 二、顺序表 1.实现动态顺序表 SeqList.h SeqList.c Test.c 问题 经验:free 出问题,2种可能性 解决问题 (2)尾删 (3)头插,头删 (4)在 pos 位…

NHANES指标推荐:aMED

文章题目:The moderating effect of alternate Mediterranean diet on the association between sedentary behavior and insomnia in postmenopausal women DOI:10.3389/fnut.2024.1516334 中文标题:替代性地中海饮食对绝经后女性久坐行为与…

Spring Cloud 远程调用

4.OpenFeign的实现原理是什么? 在使用OpenFeign的时候,主要关心两个注解,EnableFeignClients和FeignClient。整体的流程分为以下几个部分: 启用Feign代理,通过在启动类上添加EnableFeignClients注解,开启F…

力扣 — — 最长公共子序列

力扣 — — 最长公共子序列 最长公共子序列 题源:1143. 最长公共子序列 - 力扣(LeetCode) 题目: 分析: 一道经典的题目:最长公共子序列(LCS) 题目大意:求两个字符串的最长公共序列。 算法&…

当一个 HTTP 请求发往 Kubernetes(K8s)部署的微服务时,整个过程流转时怎样的?

以下是一个简单的示意图来展示这个过程: 1. 请求发起 客户端(可以是浏览器、移动应用或者其他服务)发起一个 HTTP 请求到目标微服务的地址。这个地址可以是服务的域名、IP 地址或者 Kubernetes 服务的 ClusterIP、NodePort 等。 2. 外部流量…

蓝桥杯-蓝桥幼儿园(Java-并查集)

并查集的核心思想 并查集主要由两个操作构成: Find:查找某个元素所在集合的根节点。并查集的特点是,每个元素都指向它自己的父节点,根节点的父节点指向它自己。查找过程中可以通过路径压缩来加速后续的查找操作,即将路…

C++蓝桥杯填空题(攻克版)

片头 嗨~小伙伴们,咱们继续攻克填空题,先把5分拿到手~ 第1题 数位递增的数 这道题,需要我们计算在整数 1 至 n 中有多少个数位递增的数。 什么是数位递增的数呢?一个正整数如果任何一个数位不大于右边相邻的数位。比如&#xf…

JS 构造函数实现封装性

通过构造函数实现封装性,构造函数生成的对象独立存在互不影响 创建实例对象时,其中函数的创建会浪费内存

一站式云分账系统!智能虚拟户分账系统成电商合规“刚需”

电商智能分账解决:电商一站式破解多平台资金管理难题集中管理分账,分账后秒到,并为针对电商行业三大核心痛点提供高效应对策略: 1. 票据合规困境 智能对接上下游交易数据流,构建自动化票据协同机制,有效规…

数组 array

1、数组定义 是一种用于存储多个相同类型数据的存储模型。 2、数组格式 (1)数据类型[ ] 变量名(比较常见这种格式) 例如: int [ ] arr0,定义了一个int类型的数组,数组名是arr0; &am…

linux命令六

逻辑卷 作用: 整合分散空间 空间支持扩大 步骤一:建立卷组(VG) 格式:vgcreate 卷组名 设备路径……. 如果分区不是卷组,则会先调用pvcreat 组建物理卷,再将其组建成组卷 Successfully:成功 example:例子 在man帮助中可以使用examp…

深度学习总结(8)

模型工作流程 模型由许多层链接在一起组成,并将输入数据映射为预测值。随后,损失函数将这些预测值与目标值进行比较,得到一个损失值,用于衡量模型预测值与预期结果之间的匹配程度。优化器将利用这个损失值来更新模型权重。 下面是…

基于docker搭建redis集群环境

在redis目录下创建redis-cluster目录&#xff0c;创建docker-compose.yml文化和generate.sh文件 【配置generate.sh文件】 for port in $(seq 1 9); \ do \ mkdir -p redis${port}/ touch redis${port}/redis.conf cat << EOF > redis${port}/redis.conf port 6379 …

分治-归并系列一>翻转对

目录 题目&#xff1a;解析&#xff1a;策略一&#xff1a; 代码&#xff1a;策略二&#xff1a; 代码&#xff1a; 题目&#xff1a; 链接: link 这题和逆序对区别点就是&#xff0c;要找到前一个元素是后一个元素的2倍 先找到目标值再&#xff0c;继续堆排序 解析&#xff1…

FFMPEG大文件视频分割传输教程,微信不支持1G文件以上

如下是一个2.77g的文件分割教程 . 前言 FFmpeg 是一个用于处理视频、音频等多媒体文件的开源工具包。它支持几乎所有的多媒体格式转换、剪辑和编辑&#xff0c;是开发者和多媒体工作者必备的工具。本文详细讲解如何在 Windows 系统上安装 FFmpeg 并进行基本配置。 2. 下载 FF…

MySQL5.7数据库部署和安装

1. 准备系统环境 Vmawre安装CentOS7 略… 2. 下载MySQL5.7安装包 下载地址&#xff1a; https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz 3. 卸载系统自带的MariaDB sudo yum remove $(rpm -qa | grep mariadb)4. 解压安…