如何创建 GUID/UUID?

2022-08-29 21:45:30

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

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


答案 1

[编辑于 2021-10-16 以反映生成符合 RFC4122 标准的 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() 的解决方案不能提供良好的唯一性保证。


答案 2

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

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

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

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