uuid、node-uuid、shortid 和 uuidv4 都是用于在 JavaScript 环境中生成唯一标识符(ID)的工具库。uuid 是目前的标准选择,支持多种 RFC 4122 版本。node-uuid 是 uuid 的旧称,已弃用。shortid 因安全性问题已弃用,不再推荐用于生产环境。uuidv4 通常是 uuid 库的特定版本封装,功能较为单一。本文旨在帮助开发者识别维护状态,选择安全且符合标准的方案。
在构建分布式系统、数据库主键或会话令牌时,生成唯一标识符(Unique ID)是基础需求。虽然 Math.random() 看似简单,但在并发和高安全性场景下完全不可用。本文将对比 uuid、node-uuid、shortid 和 uuidv4 这四个常见包,重点分析它们的维护状态、安全性及实际用法。
这是选型中最关键的一点。某些包虽然还能安装,但已不再安全或不再维护。
node-uuid 已正式弃用。
uuid 包的前身。uuid。// node-uuid: 已弃用,不要使用
const uuid = require('node-uuid');
const id = uuid.v4();
shortid 已正式弃用。
nanoid。// shortid: 已弃用,存在风险
const shortid = require('shortid');
const id = shortid.generate();
uuid 是当前的标准维护版本。
// uuid: 推荐的标准用法
import { v4 as uuidv4 } from 'uuid';
const id = uuidv4();
uuidv4 是特定功能的封装。
uuid 稳定。// uuidv4: 功能单一
import uuidv4 from 'uuidv4';
const id = uuidv4();
ID 生成的安全性取决于底层随机数生成器(RNG)。
uuid 使用加密安全的随机数。
crypto.randomBytes。crypto.getRandomValues。// uuid: 安全随机数
import { v4 } from 'uuid';
// 底层调用加密安全 API
const secureId = v4();
shortid 使用非安全随机数。
Math.random() 或类似弱源。// shortid: 非安全随机数
import shortid from 'shortid';
// 底层随机性较弱,不建议用于安全场景
const weakId = shortid.generate();
node-uuid 和 uuidv4 取决于具体版本。
node-uuid 随机性尚可但已停止更新。uuidv4 wrappers 通常依赖系统随机源,但缺乏主包的审计频率。// node-uuid / uuidv4: 随机性依赖实现
// 由于缺乏持续维护,安全性无法保证如主包般可靠
const id = require('node-uuid').v4();
UUID 标准(RFC 4122)定义了特定的字符串格式(8-4-4-4-12)。
uuid 严格遵循 RFC 4122。
550e8400-e29b-41d4-a716-446655440000。// uuid: 支持多种版本
import { v1, v3, v4, v5 } from 'uuid';
const timeBased = v1();
const randomBased = v4();
shortid 不遵循 UUID 标准。
P1ZT5nLb。// shortid: 非标准格式
import shortid from 'shortid';
// 输出短字符串,非 UUID 格式
const urlFriendly = shortid.generate();
node-uuid 和 uuidv4 遵循或部分遵循。
node-uuid 生成标准 UUID 但已过时。uuidv4 仅生成 v4 标准格式,不支持 v1 或 v5。// uuidv4: 仅支持 v4 标准
import uuidv4 from 'uuidv4';
// 仅能生成随机 UUID,无法生成基于时间的 ID
const onlyV4 = uuidv4();
uuidimport { v4 } from 'uuid';
const userId = v4();
nanoid (注意:不在本次对比列表,但优于 shortid)shortid 已弃用。若必须选列表内,uuid 太长,shortid 不安全。建议跳出列表选 nanoid。// 若受限于列表,无完美选择,建议迁移
uuidimport { v4 } from 'uuid';
const sessionToken = v4();
node-uuid 和 shortid 都在技术债务列表中。// 逐步替换为 uuid 或 nanoid
| 特性 | uuid | node-uuid | shortid | uuidv4 |
|---|---|---|---|---|
| 维护状态 | ✅ 活跃 | ❌ 已弃用 | ❌ 已弃用 | ⚠️ 有限 |
| 安全性 | ✅ 加密安全 | ⚠️ 过时 | ❌ 不安全 | ⚠️ 依赖实现 |
| 标准格式 | ✅ RFC 4122 | ✅ RFC 4122 | ❌ 自定义 | ✅ RFC 4122 |
| 版本支持 | ✅ v1, v3, v4, v5 | ✅ 旧版支持 | ❌ 非 UUID | ❌ 仅 v4 |
| 推荐程度 | ⭐⭐⭐⭐⭐ | ❌ 禁止使用 | ❌ 禁止使用 | ⭐⭐ |
uuid 是唯一推荐用于新项目的选择。它提供了标准合规性、安全性和长期维护保证。对于需要短 ID 的场景,不要使用 shortid,而应评估 nanoid。
node-uuid 和 shortid 应被视为技术债务。如果在现有代码库中看到它们,请制定计划迁移到现代替代品。
uuidv4 虽然可用,但引入额外依赖不如直接使用 uuid 包的子模块导入,后者更能保证一致性和更新同步。
核心原则:唯一标识符是系统的基石 — 不要在不维护的地基上构建应用。选择 uuid,确保你的 ID 生成既安全又标准。
不要在新项目中使用 node-uuid。该包已正式弃用,并更名为 uuid。继续使用它会导致依赖过时,且无法获得安全更新或新功能。请直接迁移到 uuid 包。
不要在新项目中使用 shortid。该包已弃用,存在非加密安全随机数的风险,可能导致 ID 被预测。如果需要短 ID,请评估 nanoid 等现代替代方案,而不是继续使用 shortid。
选择 uuid 作为大多数场景的标准方案。它维护活跃,符合 RFC 4122 标准,支持 v1、v3、v4、v5 多种版本,且提供 CommonJS 和 ES 模块支持。适合需要标准 UUID 格式的后端或前端项目。
仅在你严格只需要 v4 版本且希望导入更简短时使用 uuidv4。但考虑到 uuid 包本身支持树摇(tree-shaking),直接引入 uuid 的 v4 方法通常更稳妥,避免额外依赖潜在维护风险。
DEPRECATED: Use the uuid package instead. See
(Yes, the github project is still called "node-uuid". We merged the two projects. Sorry for the confusion.)