如何在 JavaScript 中创建 GUID(全局唯一标识符)? GUID / UUID 应至少为 32 个字符,并且应保持在 ASCII 范围内,以避免在传递它们时出现问题。
我不确定所有浏览器上都有哪些例程,内置随机数生成器的“随机性”和播种程度等。
原文由 Jason Cohen 发布,翻译遵循 CC BY-SA 4.0 许可协议
如何在 JavaScript 中创建 GUID(全局唯一标识符)? GUID / UUID 应至少为 32 个字符,并且应保持在 ASCII 范围内,以避免在传递它们时出现问题。
我不确定所有浏览器上都有哪些例程,内置随机数生成器的“随机性”和播种程度等。
原文由 Jason Cohen 发布,翻译遵循 CC BY-SA 4.0 许可协议
[编辑于 2021-10-16 以反映生成符合 RFC4122 标准的 UUID 的最新最佳实践]
这里的大多数读者会想要使用 uuid
模块。它经过了充分的测试和支持。
crypto.randomUUID()
函数是 Node.js 和 越来越多的浏览器 支持的新兴标准。但是,由于 新的浏览器 API 仅限于安全上下文, 因此此方法仅适用于本地服务的页面( localhost
或 127.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 许可协议
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
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 模块。