JavaScript 中生成 UUID及常见问题

JavaScript 中生成 UUID及常见问题

目录

描述

要点总结

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

现代方法:crypto.randomUUID()

浏览器实现

Node.js 实现

备用方法:crypto.getRandomValues()

uuid npm 包,实现最大灵活性

安装

基本用法(UUID v4)

其他 UUID 版本

何时避免使用 Math.random()

最佳实践和验证

UUID验证

选择合适的方法

结论

常见问题解答

UUID v4 和 v5 有什么区别?

可以在 React Native 中使用 crypto.randomUUID() 吗?

如何生成简短的唯一 ID 而不是完整的 UUID?

在 URL 或公共 API 中暴露 UUID 是否安全?


如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

描述

需要为您的 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 地址信息,可能会泄露系统详细信息。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

Read more

Kylin/Linux 服务器健康一键巡检工具

Kylin/Linux 服务器健康一键巡检工具

这份脚本是面向 Kylin V10SP2/CentOS/Ubuntu 等主流 Linux 发行版的全维度服务器健康巡检工具,一站式检测网卡 / 网络连通性 / DNS 解析 / 系统资源 / 安全基线 / 时间同步 / 硬件健康 / 系统更新 / 进程负载 / 系统日志 / 内核参数等 11 大类核心状态,并自动保存巡检日志、输出可视化汇总报告;巡检结果如下: ╔════════════════════════════════════════════════════════════╗ ║ 🚀 Kylin/Linux 服务器健康一键巡检工具 v3.0.0 ║ ╚════════════════════════════════════════════════════════════╝ 📅 巡检时间 :2026-02-25 23:05:26 🖥️ 主机名称 :192.168.1.10 📦 系统版本 : Kylin Linux Advanced Server V11 (Swan25) 🐧 内核版本 :6.

By Ne0inhk
Windowns系统WSL2 Ubuntu 方式部署Openclaw

Windowns系统WSL2 Ubuntu 方式部署Openclaw

这是官方推荐的 Windows 部署方式,提供最完整的 Linux 环境支持。 好消息!近期找到个更简单部署方法,通过镜像还原方式,适合想快速部署或零基础的! 【Openclaw安装别再花冤枉钱了!零基础镜像还原法,一次成功-哔哩哔哩】 https://b23.tv/iH4usWS 准备:启用适用于Linux的Windows子系统和虚拟化平台,重启电脑。 1. 启用 WSL2 以管理员 身份打开 PowerShell,执行: # 启用 WSL 功能 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart # 设置 WSL 2 为默认版本,

By Ne0inhk
探秘 C++ list:在复杂数据管理的编程世界里,它宛如灵动的魔法链条,高效实现元素频繁增删,有序维系数据秩序,无论是海量动态数据缓存、游戏角色属性集处理,还是复杂任务调度编排

探秘 C++ list:在复杂数据管理的编程世界里,它宛如灵动的魔法链条,高效实现元素频繁增删,有序维系数据秩序,无论是海量动态数据缓存、游戏角色属性集处理,还是复杂任务调度编排

🌟个人主页:落叶  🌟当前专栏:C++专栏 目录 list的介绍及使用 list的介绍 list的使用  list的构造  构造的list中包含n个值为val的 元素  构造空的list 拷贝构造函数  用[first, last)区间中的元素构造 list list iterator的使用  【begin+end】 【rbegin+ rend】反向迭代器  list capacity 【empty】检测list是否为空 【size 】返回list中有效节点的个数  list element access 【front】返回list的第一个节点中值的引用 【back 】返回list的最后一个节点中值的引用   list modifiers 【push_front】在list首元素前插入值为val的元素 【pop_front】删除list中第一个元素 【push_back】在list尾部插入值为val的元素

By Ne0inhk
【Linux】Linux 地址空间 + 页表映射的概念解析

【Linux】Linux 地址空间 + 页表映射的概念解析

前言:欢迎各位光临本博客,这里小编带你直接手撕**,文章并不复杂,愿诸君**耐其心性,忘却杂尘,道有所长!!!! IF’Maxue:个人主页  🔥 个人专栏: 《C语言》 《C++深度学习》 《Linux》 《数据结构》 《数学建模》 ⛺️生活是默默的坚持,毅力是永久的享受。不破不立! 文章目录 * Linux线程解析 * 一、进程与线程的核心区别 * 二、地址空间:线程共享的“窗口” * 三、线程的本质:多执行流并行 * 四、Linux为什么用进程模拟线程? * 五、其他平台的线程实现 * 六、Linux线程的调度与称呼 * 七、资源划分:共享与独占 * 八、物理内存管理:4KB页框 * 页框的地址计算 * 申请物理内存的本质 * 九、虚拟地址与页表映射 * 32位虚拟地址的划分(经典两级页表)

By Ne0inhk