如何创建 GUID/UUID?

新手上路,请多包涵

如何在 JavaScript 中创建 GUID(全局唯一标识符)? GUID / UUID 应至少为 32 个字符,并且应保持在 ASCII 范围内,以避免在传递它们时出现问题。

我不确定所有浏览器上都有哪些例程,内置随机数生成器的“随机性”和播种程度等。

原文由 Jason Cohen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

UUID(通用唯一标识符),也称为 GUID(全局唯一标识符),根据 RFC 4122 ,是旨在提供某些唯一性保证的标识符。

虽然可以在几行 JavaScript 代码中实现符合 RFC 的 UUID(例如,请参阅下面 的 @broofa 的答案),但有几个常见的陷阱:

  • id 格式无效(UUID 的格式必须为“ xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx ”,其中 x 是 [0-9 之一,af] M 是 [1-5] 之一, N 是 [8, 9、a 或 b]

  • 使用低质量的随机源(例如 Math.random

因此,鼓励为生产环境编写代码的开发人员使用严格的、维护良好的实现,例如 uuid 模块。

原文由 John Millikin 发布,翻译遵循 CC BY-SA 4.0 许可协议

[编辑于 2021-10-16 以反映生成符合 RFC4122 标准的 UUID 的最新最佳实践]

这里的大多数读者会想要使用 uuid 模块。它经过了充分的测试和支持。

crypto.randomUUID() 函数是 Node.js越来越多的浏览器 支持的新兴标准。但是,由于 新的浏览器 API 仅限于安全上下文, 因此此方法仅适用于本地服务的页面( localhost127.0.0.1 )或通过 HTTPS。如果您有兴趣看到针对 crypto.randomUUID() 取消此限制,您可以关注 此 GitHub 问题

如果这些都不适合您,则有这种方法(基于这个问题的原始答案):

 function uuidv4() {
  return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
    (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
  );
}

console.log(uuidv4());

注意: 强烈建议不要使用依赖于 Math.random()任何 UUID 生成器(包括此答案以前版本中的片段), 原因最好在此处解释TL;DR: 基于 Math.random() 的解决方案不提供良好的唯一性保证。

原文由 broofa 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题