UUID 生成器
快速生成符合 RFC 4122 标准的 UUID v4 唯一标识符
生成 UUID
使用说明
UUID(Universally Unique Identifier)是用于在分布式系统中唯一标识信息的128位标识符。本工具基于 RFC 4122 标准实现,生成的是 UUID v4 版本,使用随机数生成,确保全局唯一性。
主要功能
- 单个生成:点击"生成单个 UUID"按钮,立即生成一个符合标准的 UUID
- 批量生成:支持一次生成最多100个 UUID,适合批量测试和开发场景
- 一键复制:点击生成的 UUID 或复制按钮,快速复制到剪贴板
- 格式验证:所有生成的 UUID 都经过格式验证,确保符合标准
使用步骤
- 打开页面后,系统会自动生成第一个 UUID
- 如需生成新的 UUID,点击"生成单个 UUID"按钮
- 点击 UUID 值或"复制"按钮,将 UUID 复制到剪贴板
- 如需批量生成,点击"批量生成"按钮,输入数量后生成
- 批量生成的结果可以全部复制或下载为文本文件
适用场景
- 数据库主键:作为数据库表的主键,避免自增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:
- 生成16个随机字节(128位)
- 将第6个字节的高4位设置为4(版本号)
- 将第8个字节的高2位设置为10(变体标识)
- 将128位数据转换为十六进制字符串
- 按照标准格式插入连字符
唯一性保证
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 不依赖网络连接,可以离线使用。所有生成逻辑都在客户端执行,确保数据隐私和安全。