UUID 生成器

快速生成符合 RFC 4122 标准的 UUID v4 唯一标识符

生成 UUID

点击下方按钮生成 UUID
格式: UUID v4

使用说明

UUID(Universally Unique Identifier)是用于在分布式系统中唯一标识信息的128位标识符。本工具基于 RFC 4122 标准实现,生成的是 UUID v4 版本,使用随机数生成,确保全局唯一性。

主要功能

  • 单个生成:点击"生成单个 UUID"按钮,立即生成一个符合标准的 UUID
  • 批量生成:支持一次生成最多100个 UUID,适合批量测试和开发场景
  • 一键复制:点击生成的 UUID 或复制按钮,快速复制到剪贴板
  • 格式验证:所有生成的 UUID 都经过格式验证,确保符合标准

使用步骤

  1. 打开页面后,系统会自动生成第一个 UUID
  2. 如需生成新的 UUID,点击"生成单个 UUID"按钮
  3. 点击 UUID 值或"复制"按钮,将 UUID 复制到剪贴板
  4. 如需批量生成,点击"批量生成"按钮,输入数量后生成
  5. 批量生成的结果可以全部复制或下载为文本文件

适用场景

  • 数据库主键:作为数据库表的主键,避免自增ID的局限性
  • 分布式系统:在微服务架构中生成唯一标识符,无需中央协调
  • API 开发:为 RESTful API 的资源生成唯一标识符
  • 文件命名:为上传的文件生成唯一文件名,避免冲突
  • 会话管理:生成会话ID、令牌等唯一标识
  • 测试数据:在开发和测试中快速生成测试用的唯一标识符

技术原理

UUID 版本说明

UUID 有多个版本,本工具生成的是 UUID v4(随机UUID):

版本 说明 特点
UUID v1 基于时间戳和MAC地址 包含时间信息,可能泄露MAC地址
UUID v2 DCE安全版本 基于v1,添加了本地域标识符
UUID v3 基于MD5哈希 需要命名空间和名称,确定性生成
UUID v4 随机生成 完全随机,最常用,本工具使用此版本
UUID v5 基于SHA-1哈希 需要命名空间和名称,确定性生成

UUID v4 格式

UUID v4 的格式为:xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx

  • 总长度:36个字符(32个十六进制数字 + 4个连字符)
  • 第13位:固定为 '4',表示版本号
  • 第17位:固定为 '8'、'9'、'a' 或 'b' 之一,表示变体
  • 其他位:随机生成的十六进制数字(0-9, a-f)

生成算法

本工具使用浏览器内置的加密安全随机数生成器(Crypto API)生成 UUID:

  1. 生成16个随机字节(128位)
  2. 将第6个字节的高4位设置为4(版本号)
  3. 将第8个字节的高2位设置为10(变体标识)
  4. 将128位数据转换为十六进制字符串
  5. 按照标准格式插入连字符

唯一性保证

UUID v4 的唯一性基于以下原理:

  • 随机性:使用加密安全的随机数生成器,确保随机性
  • 空间大小:128位空间提供 2^128 种可能组合(约 3.4×10^38)
  • 碰撞概率:在生成 2.71×10^18 个 UUID 时,碰撞概率约为 50%
  • 实际应用:在实际应用中,碰撞概率极低,可以忽略不计

代码示例

JavaScript / Node.js

// 使用 crypto API 生成 UUID v4 function generateUUID() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { const r = Math.random() * 16 | 0; const v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } // 使用示例 const uuid = generateUUID(); console.log(uuid); // 输出: 例如 "a1b2c3d4-e5f6-4789-a012-b3c4d5e6f789" // Node.js 中使用 crypto 模块(更安全) const crypto = require('crypto'); function generateSecureUUID() { return crypto.randomUUID(); }

Python

import uuid # 生成 UUID v4 uuid_value = uuid.uuid4() print(uuid_value) # 输出: 例如 "a1b2c3d4-e5f6-4789-a012-b3c4d5e6f789" # 转换为字符串 uuid_str = str(uuid_value) # 在数据库中使用(SQLAlchemy示例) from sqlalchemy import Column, String import uuid class User(Base): __tablename__ = 'users' id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))

Java

import java.util.UUID; // 生成 UUID v4 UUID uuid = UUID.randomUUID(); String uuidString = uuid.toString(); System.out.println(uuidString); // 输出: 例如 "a1b2c3d4-e5f6-4789-a012-b3c4d5e6f789" // 在 Spring Boot 中使用 @Entity public class User { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid2") private String id; }

PHP

// PHP 7.1+ 使用 ramsey/uuid 库 use Ramsey\Uuid\Uuid; $uuid = Uuid::uuid4(); echo $uuid->toString(); // 输出: 例如 "a1b2c3d4-e5f6-4789-a012-b3c4d5e6f789" // 在 Laravel 中使用 use Illuminate\Support\Str; $uuid = (string) Str::uuid();

Go

import ( "fmt" "github.com/google/uuid" ) // 生成 UUID v4 uuidValue, err := uuid.NewRandom() if err != nil { panic(err) } fmt.Println(uuidValue.String()) // 输出: 例如 "a1b2c3d4-e5f6-4789-a012-b3c4d5e6f789"

SQL 数据库

-- MySQL 8.0+ CREATE TABLE users ( id CHAR(36) PRIMARY KEY DEFAULT (UUID()), name VARCHAR(100) ); -- PostgreSQL CREATE TABLE users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(100) ); -- SQL Server CREATE TABLE users ( id UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(), name NVARCHAR(100) );

最佳实践

何时使用 UUID

  • 分布式系统:多个服务需要独立生成唯一ID,无需中央协调
  • 数据合并:需要合并来自不同数据库的数据,避免ID冲突
  • 安全性:不希望暴露序列信息,避免被猜测和枚举
  • 离线生成:客户端需要离线生成唯一标识符

何时不使用 UUID

  • 性能敏感:UUID 比自增ID占用更多存储空间(36字节 vs 4-8字节)
  • 索引性能:UUID 作为主键时,索引性能可能不如整数ID
  • 顺序需求:需要按生成时间排序的场景,自增ID更合适
  • 简单应用:单机应用且不需要分布式唯一性时,自增ID更简单

数据库使用建议

  • 存储类型:使用 CHAR(36) 或 VARCHAR(36) 存储字符串格式,或使用专门的 UUID 类型
  • 索引策略:UUID 作为主键时,考虑使用有序 UUID(如 UUID v1)或雪花算法
  • 性能优化:如果性能是关键,考虑使用二进制格式存储(16字节)
  • 查询优化:避免在 WHERE 子句中使用函数处理 UUID,保持索引效率

安全注意事项

  • 随机性:确保使用加密安全的随机数生成器,避免可预测性
  • 传输安全:在 URL 中使用 UUID 时,注意不要泄露敏感信息
  • 验证输入:接收 UUID 时,始终验证格式,防止注入攻击
  • 隐私保护:UUID v1 包含 MAC 地址信息,不适合在需要隐私的场景使用

常见问题

UUID 和 GUID 有什么区别?

UUID(Universally Unique Identifier)和 GUID(Globally Unique Identifier)本质上是相同的概念。GUID 是微软对 UUID 的称呼,两者都遵循相同的标准(RFC 4122)。在技术实现上,它们是完全相同的。

UUID 会重复吗?

理论上,UUID 有重复的可能性,但概率极低。UUID v4 使用 122 位随机数,提供约 5.3×10^36 种可能组合。即使每秒生成 10 亿个 UUID,也需要约 170 亿年才会有一半的概率出现一次碰撞。在实际应用中,可以认为 UUID 是唯一的。

UUID 可以作为数据库主键吗?

可以,但需要注意性能影响。UUID 作为主键的优点是不需要中央协调、适合分布式系统、不会泄露序列信息。缺点是占用更多存储空间、索引性能可能不如整数ID、无法直接按生成时间排序。建议根据具体场景选择:分布式系统或需要合并数据的场景适合使用 UUID,单机高性能应用可能更适合自增ID。

如何验证 UUID 格式?

可以使用正则表达式验证 UUID 格式:

// JavaScript const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; const isValid = uuidRegex.test(uuidString); // Python import re uuid_pattern = re.compile(r'^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', re.I) is_valid = bool(uuid_pattern.match(uuid_string))

UUID 可以缩短吗?

可以,但不推荐。UUID 可以转换为 Base64 或其他编码格式来缩短长度,但这会失去标准兼容性。如果需要更短的唯一标识符,可以考虑使用:

  • 短UUID:使用 Base62 编码,长度约 22 字符
  • NanoID:更短的唯一ID生成库,默认 21 字符
  • 雪花算法:Twitter 的分布式ID生成算法,生成 64 位整数

批量生成 UUID 会影响性能吗?

本工具在浏览器本地生成 UUID,不依赖服务器,性能主要受浏览器 JavaScript 引擎影响。批量生成 100 个 UUID 通常在几毫秒内完成,对性能影响可以忽略。如果需要生成大量 UUID(如数万个),建议在服务器端使用专门的库,性能会更好。

生成的 UUID 可以离线使用吗?

可以。本工具完全在浏览器本地运行,生成的 UUID 不依赖网络连接,可以离线使用。所有生成逻辑都在客户端执行,确保数据隐私和安全。