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

UUID(通用唯一标识符)详解和实践

UUID(通用唯一标识符)详解

UUID(Universally Unique Identifier)是一种128位的全局唯一标识符,通常由32个十六进制字符表示,格式为8-4-4-4-12的分组结构(如550e8400-e29b-41d4-a716-446655440000)‌。它的核心设计目标是确保在任何时间、任何地点生成的标识符都是唯一的,即使在分布式系统中也能保持唯一性‌。

UUID的主要版本

  1. 版本1‌:基于时间戳、随机数和MAC地址生成,利用MAC地址的全球唯一性保证UUID唯一性,但存在隐私泄露风险‌
  2. 版本2‌:将V1的时间戳前四位替换为Posix的UID/GID,实际应用较少‌
  3. 版本3‌:基于命名空间和名称的MD5哈希生成,用户可控制命名空间和名称来确保唯一性‌
  4. 版本4‌:完全基于随机数/伪随机数生成,是Java中randomUUID()方法的实现方式‌
  5. 版本5‌:与V3类似但使用SHA-1算法替代MD5‌

UUID的特性与应用

核心特性

  • 分布式生成‌:无需中央管理机构即可独立生成‌
  • 极高唯一性‌:128位空间提供约3.4×10³⁸种组合,重复概率极低‌
  • 跨平台兼容‌:标准化的字符串表示形式‌

典型应用场景

  • 设备标识(替代IMEI/MEID)‌
  • 应用区分(同一设备上不同应用的独立标识)‌
  • 蓝牙通信服务标识‌
  • 文件系统和磁盘分区标识(Linux系统)‌
  • 分布式系统追踪ID和实体标识‌

技术实现细节

在编程语言中的实现:

  • Java‌:提供nameUUIDFromBytes()(V3)和randomUUID()(V4)两种实现‌
  • Python‌:通过uuid模块支持各版本UUID生成‌3
  • 现代实现通常采用高安全性随机数生成器降低重复风险‌5

唯一性计算示例:

  • 每天生成100亿个UUID,持续100年(约1000万亿个),重复概率仅百万分之一‌
  • 每秒生成1亿个持续100年,重复概率才会升至50%(现实中几乎不可能)‌

注意事项

  1. 隐私问题‌:基于MAC地址的V1/V2可能泄露硬件信息‌
  2. 存储开销‌:较长的字符串可能增加存储和传输负担‌
  3. 版本选择‌:
    • 需要确定性结果时选择V3/V5
    • 常规应用V4即可满足需求‌

在Linux系统中,UUID常用于稳定标识设备和文件系统,避免设备名变化导致的问题,可通过blkid/dev/disk/by-uuid查看和管理‌。

Python中如何生成UUID?

在Python中生成UUID主要通过标准库uuid模块实现,以下是具体方法和版本说明:

1. 基础生成方法

import uuid # 生成随机UUID(版本4) 
random_uuid = uuid.uuid4() # 示例输出:f47ac10b-58cc-4372-a567-0e02b2c3d479

2. 不同版本UUID生成

  • 版本1‌:基于时间戳和MAC地址
    time_based_uuid = uuid.uuid1() # 示例:a8098c1a-f86e-11da-bd1a-00112444be1e
  • 版本3/5‌:基于命名空间和名称的哈希
    namespace_dns = uuid.NAMESPACE_DNS namespace_dns = uuid.NAMESPACE_DNS
    hashed_uuid = uuid.uuid3(namespace_dns, "example.com")  # MD5哈希:ml-citation{ref="5" data="citationList"}
    sha1_uuid = uuid.uuid5(namespace_dns, "example.com")    # SHA-1哈希:ml-citation{ref="5" data="citationList"}
    

3. 格式转换

# 转换为字符串
str_uuid = str(random_uuid)  # 标准8-4-4-4-12格式:ml-citation{ref="1,7" data="citationList"}# 紧凑格式(无连字符)
compact_uuid = random_uuid.hex  # 32字符十六进制串:ml-citation{ref="3,7" data="citationList"}

4. 高级用法

  • URL安全ID‌:移除URN前缀
    url_safe = uuid.uuid4().urn[9:]  # 输出类似:f47ac10b58cc4372a5670e02b2c3d479:ml-citation{ref="3,7" data="citationList"}
    

  • 批量生成验证唯一性
    uuid_set = {uuid.uuid4() for _ in range(1000)}  # 确保1000个UUID无重复:ml-citation{ref="2" data="citationList"}
    

注意事项

  • 版本选择‌:常规场景用uuid4(),需要确定性输出用uuid3()/uuid5()35
  • 安全性‌:敏感场景建议结合secrets模块增强随机性3
  • 存储优化‌:数据库存储时可使用BINARY(16)替代字符串节省空间1

如需生成更复杂的唯一标识符,可结合时间戳或哈希函数扩展功能

实践

代码

使用下面的代码例子

import uuid# 定义命名空间(示例使用URL格式)
namespace = uuid.NAMESPACE_URL  
# 或者使用其他命名空间:
# namespace = uuid.NAMESPACE_DNS
# namespace = uuid.NAMESPACE_OID# 输入名称(可以是任意字符串)
name = "中国山东济宁"# 生成UUIDv5
uuid_v5 = uuid.uuid5(namespace, name)print(f"Generated UUIDv5: {uuid_v5}")

将文件保存为uuid_generator.py

执行

python uuid_generator.py
国家: 中国, 省份: 山东, 城市: 济宁
生成的UUID v5: e03c2086-4601-554c-8a1d-3dcad51f51f5
直接使用'中国山东济宁'生成的UUID v5: e03c2086-4601-554c-8a1d-3dcad51f51f5

http://www.dtcms.com/a/341605.html

相关文章:

  • 今日行情明日机会——20250820
  • K8S集群-基于Ingress资源实现域名访问
  • 软件测试面试题真题分享
  • 华为云之基于鲲鹏弹性云服务器部署openGauss数据库【玩转华为云】
  • VMware Workstation | 安装Ubuntu20.04.5
  • 红警国家的注册
  • Linux系统:管道通信
  • 牛津大学xDeepMind 自然语言处理(4)
  • README
  • AVL左旋右旋 学习小得
  • 【机器学习】什么是损失景观(Loss Landscape)?
  • Claude Code Git Commit Push 命令
  • 大模型4位量化 (46)
  • linux内核源码下载
  • CMOS知识点 MOS管不同工作区域电容特性
  • SED项目复现学习实录
  • Linux基础介绍-3——第一阶段
  • oracle服务器导入dmp文件
  • 力扣 hot100 Day79
  • ragflow 通过HuggingFace 配置rerank模型
  • 有序二叉树的删除
  • leetcode 3 无重复字符的最长子串
  • 个人使用AI开发的《PlSqlRewrite4GaussDB(PLSQL自动转换工具)1.0.1 BETA》发布
  • 【OneAI】使用Rust构建的轻量AI网关
  • linux环境问题
  • HyperMesh许可证分配优化策略
  • 【Ansible】变量、机密、事实
  • 福昕PDF编辑软件高级版下载与详细图文安装教程!!
  • Pub/Sub是什么意思
  • LWIP的Socket API 与实现关系