跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScriptNode.jsReact Native大前端

JavaScript 生成 UUID 的常用方法及注意事项

了 JavaScript 中生成 UUID 的三种主要方案:现代内置 API crypto.randomUUID()、备用方案 crypto.getRandomValues() 以及通用库 uuid npm 包。文章对比了各方案的适用场景(如 Node.js 版本、浏览器兼容性、特定 UUID 版本需求),并明确指出生产环境严禁使用 Math.random()。此外,还提供了 UUID 格式验证的正则表达式及最佳实践建议,帮助开发者选择最合适的唯一标识符生成方式。

并发大师发布于 2026/3/22更新于 2026/8/2567 浏览
JavaScript 生成 UUID 的常用方法及注意事项

什么是 UUID?为什么要使用它?

UUID(通用唯一标识符)是一个 128 位标识符,格式为 36 个字符:550e8400-e29b-41d4-a716-446655440000。这些标识符也称为 GUID,几乎可以保证其唯一性,而无需中央机构或数据库协调。

对于前端和 Node.js 开发人员来说,UUID 解决了关键问题:

  • 数据库记录:生成无自增冲突的主键
  • 会话令牌:创建不可预测的、唯一的会话标识符
  • 文件命名:防止上传内容出现命名冲突
  • 请求跟踪:跟踪跨微服务的操作

要点总结

  • 适用 crypto.randomUUID() 于现代环境(Node.js 14.17+ 和最新版本的浏览器)
  • 实现 crypto.getRandomValues() 对旧版浏览器的支持,并具备加密安全性
  • 当您需要特定 UUID 版本或最大兼容性时,请选择 uuid npm 包。
  • Math.random() 由于缺乏加密安全性,切勿在生产环境中使用 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()

虽然您可能会发现使用 Math.random() 的 UUID 实现,但这些应该仅用于测试或非安全环境:

// ⚠️ 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 地址信息,可能会泄露系统详细信息。

目录

  1. 什么是 UUID?为什么要使用它?
  2. 要点总结
  3. 现代方法:crypto.randomUUID()
  4. 浏览器实现
  5. Node.js 实现
  6. 备用方法:crypto.getRandomValues()
  7. uuid npm 包,实现最大灵活性
  8. 安装
  9. 基本用法(UUID v4)
  10. 其他 UUID 版本
  11. 何时避免使用 Math.random()
  12. 最佳实践和验证
  13. UUID 验证
  14. 选择合适的方法
  15. 结论
  16. 常见问题解答
  17. UUID v4 和 v5 有什么区别?
  18. 可以在 React Native 中使用 crypto.randomUUID() 吗?
  19. 如何生成简短的唯一 ID 而不是完整的 UUID?
  20. 在 URL 或公共 API 中暴露 UUID 是否安全?
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 利用 AI 智能体快速完成 C 语言与前端课程实训实战指南
  • 从零构建 Transformer 模型:可视化矩阵乘法入门教程
  • 基于 Leaflet 与 WebGIS 的省域区县天气可视化实现
  • WebVOWL 本体可视化工具完整部署手册
  • AIGC 时代 R 语言在数据科学中的应用与展望
  • Python+AI 入门指南:环境搭建与实战案例
  • 机器学习:逻辑回归与线性回归的区别
  • 《Agent Runtime 工程化》第九章 可观测与 Trace:9.6 动手任务
  • OpenClaw Skills 安装与实战:构建 AI 技能工具箱
  • 企业级 RAG 系统的构建、优化与效益分析
  • Go Web 开发基础:模板引擎与控制器实战
  • MySQL 内置函数实战:日期、字符串与数学运算详解
  • AI 时代产品经理的能力边界:AI 能做什么与不能做什么
  • 基于 MCP+Skill 的前端 JS 逆向自动化落地实践
  • 原生 JavaScript 实现数组扁平化的几种方案
  • Android 密码输入控件的另一种实现:单个 EditText 配上多个 ImageView
  • 50 道经典 Python 面试题解析
  • Python 入门:开发环境与虚拟环境配置指南
  • MyBatisPlus 后端与 Thymeleaf 前端全栈分页整合方案
  • LangChain 框架入门:核心组件、模块与文档指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online