JavaScript 中生成 UUID及常见问题
目录
可以在 React Native 中使用 crypto.randomUUID() 吗?

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
描述
需要为您的 JavaScript 应用程序生成唯一标识符吗?无论您是构建数据库驱动的应用程序、管理用户会话还是跟踪分布式请求,生成 UUID 都是每位开发人员都需要掌握的基本技能。
本指南涵盖了 JavaScript UUID 生成的现代方法,从内置crypto.randomUUID()方法到功能强大的 uuid npm 包。您将了解哪种方法最适合您的具体用例——无论是前沿的 Web 应用程序、Node.js 服务,还是需要广泛兼容性的遗留系统。
要点总结
- 适用
crypto.randomUUID()于现代环境(Node.js 14.17+ 和最新版本的浏览器) - 实现
crypto.getRandomValues()对旧版浏览器的支持,并具备加密安全性 - 当您需要特定 UUID 版本或最大兼容性时,请选择 uuid npm 包。
Math.random()由于缺乏加密安全性,切勿在生产环境中使用UUID。
什么是UUID?为什么要使用它?
UUID(通用唯一标识符)是一个 128 位标识符,格式为 36 个字符:550e8400-e29b-41d4-a716-446655440000。这些标识符也称为 GUID,几乎可以保证其唯一性,而无需中央机构或数据库协调。
对于前端和Node.js开发人员来说,UUID解决了关键问题:
- 数据库记录:生成无自增冲突的主键
- 会话令牌:创建不可预测的、唯一的会话标识符
- 文件命名:防止上传内容出现命名冲突
- 请求跟踪:跟踪跨微服务的操作
现代方法:crypto.randomUUID()
该crypto.randomUUID()方法是目前现代环境中生成唯一 ID 值的标准方法。它已内置于浏览器和 Node.js(14.17+)中,无需任何依赖项,并生成加密安全的 UUID v4 值。
浏览器实现
const uuid = crypto.randomUUID();
console.log(uuid); // "3b99e3e0-7598-4bf8-b9c1-e915af91713c"
Node.js 实现
import { randomUUID } from 'crypto';
const uuid = randomUUID();
console.log(uuid); // "b7e44f0a-811f-4c1c-b7f0-48d51f5dbc1f"
浏览器支持:Chrome 92+、Firefox 95+、Safari 15.4+、Edge 92+;
Node.js 支持:版本 14.17.0+
crypto.randomUUID()当您需要在现代应用程序中使用安全、随机的 UUID 而无需外部依赖项时,请使用此方法。
备用方法:crypto.getRandomValues()
对于不支持的环境crypto.randomUUID(),您可以使用其他方法实现 UUID v4 生成crypto.getRandomValues()。此方法适用于 Chrome 11 及更高版本的浏览器以及安装了 crypto 模块的 Node.js 版本。
function generateUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
const r = crypto.getRandomValues(new Uint8Array(1))[0];
const v = c === 'x' ? (r & 0x0f) : ((r & 0x03) | 0x08);
return v.toString(16);
});
}
const uuid = generateUUID();
console.log(uuid); // "42254574-affd-47cc-9915-0ecae592351b"
这种方法既能保持加密安全性,又能支持旧环境。

uuid npm 包,实现最大灵活性
uuid npm 包仍然是生成 JavaScript UUID 最通用的解决方案,尤其是在需要特定 UUID 版本或最大兼容性时。
安装
npm install uuid
基本用法(UUID v4)
import { v4 as uuidv4 } from 'uuid';
const uuid = uuidv4();
console.log(uuid); // "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed"
其他 UUID 版本
import { v1, v3, v5 } from 'uuid';
// v1: Timestamp-based (sortable)
const uuid1 = v1();
// v3/v5: Name-based (deterministic)
const uuid5 = v5('hello.example.com', v5.DNS);
uuid 软件包支持所有 UUID 版本(v1-v5),因此在您需要以下功能时非常理想:
- 基于时间戳的可排序标识符 UUID(v1)
- 从命名空间/名称对中确定性 UUID(v3、v5)
- 向后兼容旧版 Node.js
- React Native 或其他非标准环境
何时避免使用 Math.random()
虽然您可能会发现使用 `<u>` 的 UUID 实现Math.random(),但这些应该仅用于测试或非安全环境:
// ⚠️ NOT SECURE - Testing only
function testUUID() {
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);
});
}
Math.random()缺乏加密安全性,不应用于生产环境 UUID。

最佳实践和验证
UUID验证
务必验证来自外部来源的 UUID:
function isValidUUID(uuid) {
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;
return uuidRegex.test(uuid);
}
console.log(isValidUUID('550e8400-e29b-41d4-a716-446655440000')); // true
选择合适的方法
- 现代 Web 应用程序或 Node.js 14.17+:使用
crypto.randomUUID() - 需要对旧版浏览器提供支持:实现方式
crypto.getRandomValues() - 特定 UUID 版本(v1、v3、v5):使用 uuid npm 包
- 最大程度的兼容性:使用 uuid npm 包
- 仅供快速测试/原型开发:Math.random() 实现
结论
JavaScript 中的 UUID 生成不必复杂。对于大多数现代应用程序来说,crypto.randomUUID()它提供了一个简单且安全的解决方案。当您需要更广泛的兼容性或特定版本的 UUID 时,uuid npm 包可以满足您的需求。只需记住,在生产环境中避免使用 Math.random(),并验证来自外部来源的任何 UUID。
选择适合您的环境和需求的方法——未来的您(和您的团队)会感谢您在整个代码库中使用清晰、可靠的唯一标识符。
常见问题解答
UUID v4 和 v5 有什么区别?
UUID v4 使用随机数或伪随机数,因此每个 ID 都不可预测。UUID v5 使用 SHA-1 哈希算法,根据命名空间和名称生成确定性 ID,因此相同的输入始终生成相同的 UUID。
可以在 React Native 中使用 crypto.randomUUID() 吗?
不,React Native 本身并不支持 crypto.randomUUID()。请改用 uuid npm 包,它提供了一个兼容的实现,可以在各种 React Native 环境中使用。
如何生成简短的唯一 ID 而不是完整的 UUID?
对于较短的 ID,可以考虑使用 nanoid 或 shortid 包。它们生成的 URL 安全唯一字符串比 UUID 更紧凑,同时又能满足大多数应用的唯一性要求。
在 URL 或公共 API 中暴露 UUID 是否安全?
是的,UUID v4 值经过加密随机处理,可以安全公开。但是,请避免在公共场合使用 UUID v1,因为它包含时间戳和 MAC 地址信息,可能会泄露系统详细信息。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。