node-uuid vs shortid vs uuid vs uuidv4
JavaScript 唯一标识符生成方案选型指南
node-uuidshortiduuiduuidv4类似的npm包:

JavaScript 唯一标识符生成方案选型指南

uuid、node-uuid、shortid 和 uuidv4 都是用于在 JavaScript 环境中生成唯一标识符(ID)的工具库。uuid 是目前的标准选择,支持多种 RFC 4122 版本。node-uuid 是 uuid 的旧称,已弃用。shortid 因安全性问题已弃用,不再推荐用于生产环境。uuidv4 通常是 uuid 库的特定版本封装,功能较为单一。本文旨在帮助开发者识别维护状态,选择安全且符合标准的方案。

npm下载趋势

3 年

GitHub Stars 排名

统计详情

npm包名称
下载量
Stars
大小
Issues
发布时间
License
node-uuid0270-09 年前-
shortid05,71121.7 kB162 年前MIT
uuid015,33165.7 kB21 个月前MIT
uuidv40-17.4 kB--MIT

JavaScript 唯一标识符生成方案:uuid、node-uuid、shortid 与 uuidv4 深度对比

在构建分布式系统、数据库主键或会话令牌时,生成唯一标识符(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 是当前的标准维护版本。

  • 活跃维护,支持最新 Node.js 和浏览器环境。
  • 符合 RFC 4122 标准。
  • 提供完整的类型定义和模块支持。
// uuid: 推荐的标准用法
import { v4 as uuidv4 } from 'uuid';
const id = uuidv4();

uuidv4 是特定功能的封装。

  • 通常仅仅提供 v4 算法。
  • 维护状态不如主包 uuid 稳定。
  • 功能单一,扩展性差。
// uuidv4: 功能单一
import uuidv4 from 'uuidv4';
const id = uuidv4();

🔐 安全性与随机数质量

ID 生成的安全性取决于底层随机数生成器(RNG)。

uuid 使用加密安全的随机数。

  • 在 Node.js 中使用 crypto.randomBytes。
  • 在浏览器中使用 crypto.getRandomValues。
  • 适合生成会话 ID、安全令牌。
// uuid: 安全随机数
import { v4 } from 'uuid';
// 底层调用加密安全 API
const secureId = v4(); 

shortid 使用非安全随机数。

  • 基于 Math.random() 或类似弱源。
  • 在高并发下碰撞风险增加。
  • 可能被攻击者预测下一个 ID。
// 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。
  • 支持 v1 (时间基于), v3/v5 (命名空间基于), v4 (随机)。
  • 适合跨语言系统交互。
// uuid: 支持多种版本
import { v1, v3, v4, v5 } from 'uuid';
const timeBased = v1(); 
const randomBased = v4(); 

shortid 不遵循 UUID 标准。

  • 生成短字符串,如 P1ZT5nLb。
  • 适合 URL 友好场景,但不是 UUID。
  • 无法与其他 UUID 解析器兼容。
// 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(); 

🛠️ 实际工程场景选型

场景 1:数据库主键

  • ✅ 最佳选择: uuid
  • 为什么?标准格式,广泛支持,安全。
import { v4 } from 'uuid';
const userId = v4();

场景 2:URL 短链接

  • ✅ 最佳选择: nanoid (注意:不在本次对比列表,但优于 shortid)
  • 为什么?shortid 已弃用。若必须选列表内,uuid 太长,shortid 不安全。建议跳出列表选 nanoid。
// 若受限于列表,无完美选择,建议迁移

场景 3:临时会话令牌

  • ✅ 最佳选择: uuid
  • 为什么?需要加密安全随机数,防止会话劫持。
import { v4 } from 'uuid';
const sessionToken = v4();

场景 4:旧项目维护

  • ⚠️ 处理建议: 计划迁移
  • 为什么?node-uuid 和 shortid 都在技术债务列表中。
// 逐步替换为 uuid 或 nanoid

📊 总结对比表

特性uuidnode-uuidshortiduuidv4
维护状态✅ 活跃❌ 已弃用❌ 已弃用⚠️ 有限
安全性✅ 加密安全⚠️ 过时❌ 不安全⚠️ 依赖实现
标准格式✅ 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 vs shortid vs uuid vs uuidv4

  • node-uuid:

    不要在新项目中使用 node-uuid。该包已正式弃用,并更名为 uuid。继续使用它会导致依赖过时,且无法获得安全更新或新功能。请直接迁移到 uuid 包。

  • shortid:

    不要在新项目中使用 shortid。该包已弃用,存在非加密安全随机数的风险,可能导致 ID 被预测。如果需要短 ID,请评估 nanoid 等现代替代方案,而不是继续使用 shortid。

  • uuid:

    选择 uuid 作为大多数场景的标准方案。它维护活跃,符合 RFC 4122 标准,支持 v1、v3、v4、v5 多种版本,且提供 CommonJS 和 ES 模块支持。适合需要标准 UUID 格式的后端或前端项目。

  • uuidv4:

    仅在你严格只需要 v4 版本且希望导入更简短时使用 uuidv4。但考虑到 uuid 包本身支持树摇(tree-shaking),直接引入 uuid 的 v4 方法通常更稳妥,避免额外依赖潜在维护风险。

node-uuid的README

node-uuid

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.)