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

【大数据存储与管理】分布式文件系统HDFS:05 HDFS存储原理

【大数据存储与管理】分布式文件系统HDFS:05 HDFS存储原理

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈大数据技术原理与应用 ⌋ ⌋ ⌋专栏系统介绍大数据的相关知识,分为大数据基础篇、大数据存储与管理篇、大数据处理与分析篇、大数据应用篇。内容包含大数据概述、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数据库HBase、NoSQL数据库、云数据库、MapReduce、Hadoop再探讨、数据仓库Hive、Spark、流计算、Flink、图计算、数据可视化,以及大数据在互联网领域、生物医学领域的应用和大数据的其他应用。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/BigData_principle_application。 文章目录 * 一、数据的冗余存储 * 二、数据存取策略 * (一)数据存放 * (二)数据读取 * (三)数据复制 * 三、数据错误与恢复 * (一)

By Ne0inhk
Flutter 三方库 image_compare_2 的鸿蒙化适配指南 - 实现像素级的图像分块对比、支持感知哈希(pHash)与端侧视觉差异检测实战

Flutter 三方库 image_compare_2 的鸿蒙化适配指南 - 实现像素级的图像分块对比、支持感知哈希(pHash)与端侧视觉差异检测实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 image_compare_2 的鸿蒙化适配指南 - 实现像素级的图像分块对比、支持感知哈希(pHash)与端侧视觉差异检测实战 前言 在进行 Flutter for OpenHarmony 的图像处理、自动化 UI 测试或内容防侵权应用开发时,如何科学地判断两张图片是否“相似”?简单的字节对比显然无法处理微小的色差或尺寸缩放。image_compare_2 是一个功能完备的图像对比算法库。它支持从均值哈希(aHash)到分块均方差(MSE)等多种度量算法。本文将指导大家如何在鸿蒙真机上利用该库构建精准的视觉检测链路。 一、原原理性解析 / 概念介绍 1.1 基础原理 image_compare_2 通过将原始图片灰度化、缩小尺寸并进行频域变换(或像素聚合)

By Ne0inhk

YOLOv9摄像头实时检测,python detect_dual.py命令详解

YOLOv9摄像头实时检测,python detect_dual.py命令详解 在当前智能视觉应用快速发展的背景下,YOLOv9凭借其卓越的精度与推理效率,成为目标检测领域的新标杆。本镜像基于官方代码库构建,预装完整深度学习环境,支持开箱即用的训练、推理与评估流程。本文将重点解析如何使用python detect_dual.py实现摄像头实时检测,并深入剖析该命令的核心参数配置、运行逻辑及工程实践要点。 1. 环境准备与基础调用 1.1 镜像环境初始化 本镜像已集成以下关键组件: * PyTorch 1.10.0 + CUDA 12.1:保障高性能GPU推理 * OpenCV-Python:用于视频流采集与图像处理 * YOLOv9官方代码库:位于 /root/yolov9 * 预置权重文件 yolov9-s.pt:无需额外下载即可启动推理 启动容器后,首先激活专用conda环境: conda activate yolov9 cd /root/yolov9

By Ne0inhk

两周时间,我从Python零基础到做出准确率97%的AI应用

🚀 从零开始:我的第一个机器学习项目(猫狗识别器) 用两周时间,从Python零基础到部署一个准确率97%的AI应用 📌 前言 作为一个完全零基础的小白,我一直觉得“机器学习”是个很高深的名词。直到两周前,我决定动手试试——从搭建环境开始,一步步完成了一个猫狗图像分类器。现在,它已经是一个可以在浏览器里运行的Web应用了! 项目地址:https://github.com/Hinatatoo/cat-dog-classifier 🎯 项目目标 做一个能区分猫和狗的AI模型,并把它部署成网页应用,让任何人都能上传图片测试。 📊 最终成果 指标结果验证集准确率97%训练时间约2小时(含优化)模型大小27MB识别速度<1秒 🛣️ 学习路线 第1天:环境搭建 * 安装Python 3.10 * 配置VS Code * 创建虚拟环境 ml_env * 安装TensorFlow、Streamlit等库 遇到的坑:pip 找不到命令

By Ne0inhk