首页 > JavaScript > 如何创建 GUID / UUID?

如何创建 GUID / UUID?

上一篇 下一篇

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

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

分割线

网友回答:

根据 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 模块。

分割线

网友回答:

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

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

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

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

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 生成器(包括此答案的先前版本中的片段),原因最好在这里解释。DR:基于的解决方案不能提供良好的唯一性保证。Math.random()

分割线

网友回答:

我真的很喜欢Broofa的答案是多么干净,但不幸的是,糟糕的实现留下了碰撞的机会。Math.random

下面是一个类似的 RFC4122 版本 4 兼容解决方案,它通过将前 13 个十六进制数字偏移时间戳的十六进制部分来解决此问题,并且一旦耗尽自页面加载以来微秒的十六进制部分偏移量。这样,即使在同一种子上,两个客户端也必须生成自页面加载以来完全相同的微秒数(如果支持高性能时间)并且完全相同的毫秒数(或 10,000+ 年后)才能获得相同的 UUID:Math.random

function generateUUID() { // Public Domain/MIT
    var d = new Date().getTime();//Timestamp
    var d2 = ((typeof performance !== 'undefined') && performance.now && (performance.now()*1000)) || 0;//Time in microseconds since page-load or 0 if unsupported
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random() * 16;//random number between 0 and 16
        if(d > 0){//Use timestamp until depleted
            r = (d + r)%16 | 0;
            d = Math.floor(d/16);
        } else {//Use microseconds since page-load if supported
            r = (d2 + r)%16 | 0;
            d2 = Math.floor(d2/16);
        }
        return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
    });
}

var onClick = function(){
    document.getElementById('uuid').textContent = generateUUID();
}
onClick();
#uuid { font-family: monospace; font-size: 1.5em; }
<p id="uuid"></p>
<button id="generateUUID" onclick="onClick();">Generate UUID</button>

这是一个要测试的小提琴。


ES6 的现代化代码段

const generateUUID = () => {
  let
    d = new Date().getTime(),
    d2 = ((typeof performance !== 'undefined') && performance.now && (performance.now() * 1000)) || 0;
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
    let r = Math.random() * 16;
    if (d > 0) {
      r = (d + r) % 16 | 0;
      d = Math.floor(d / 16);
    } else {
      r = (d2 + r) % 16 | 0;
      d2 = Math.floor(d2 / 16);
    }
    return (c == 'x' ? r : (r & 0x7 | 0x8)).toString(16);
  });
};

const onClick = (e) => document.getElementById('uuid').textContent = generateUUID();

document.getElementById('generateUUID').addEventListener('click', onClick);

onClick();
#uuid { font-family: monospace; font-size: 1.5em; }
<p id="uuid"></p>
<button id="generateUUID">Generate UUID</button>

模板简介:该模板名称为【如何创建 GUID / UUID?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【JavaScript】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 325次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-09
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信素材 微信公众平台 微信模板 微信文章 自适应 html5 企业网站 单页式简历模板 微信图片 响应式
您可能会喜欢的其他模板