一尘不染

如何创建 GUID/UUID

javascript

我正在尝试在 JavaScript 中创建全局唯一标识符。我不确定所有浏览器上都有哪些例程,内置随机数生成器的“随机”和种子如何等等。

GUID / UUID 应至少为 32 个字符,并且应保持在 ASCII 范围内以避免在传递它们时出现问题。


阅读 318

收藏
2022-01-07

共2个答案

一尘不染

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

虽然可以在几行 JavaScript 代码中实现符合 RFC 的 UUID,但有几个常见的陷阱:

  • 无效的 id 格式(UUID 必须采用“ xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx”形式,其中 x 是 [0-9, af] 之一M是 [1-5] 之一,N是 [8, 9, a 或 b]
  • 使用低质量的随机源(例如Math.random

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

2022-01-07
一尘不染

[编辑 2021-10-16 以反映生成 RFC4122-complaint UUID 的最新最佳实践]

这里的大多数读者都希望使用uuid模块。它经过充分测试和支持。

crypto.randomUUID()功能是在支持新兴的标准Node.js越来越多的浏览器

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

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() 的解决方案不提供良好的唯一性保证。

2022-01-07