使用JavaScript生成UUID/GUID的三种方法

 更新时间:2026年03月15日 13:54:54   作者:hefeng_aspnet  
文章介绍了三种使用JavaScript生成UUID/GUID的方法及其优缺点,方法1简单但格式不规范;方法2解决了格式问题但可能产生碰撞;方法3结合时间戳解决了格式和碰撞问题,主流浏览器支持,但IE不支持,需要的朋友可以参考下

UUID 是「Universally Unique IDentifier」(通用唯一识别码)的缩写,目的是唯一的标示信息。UUID 包含 32 个十六进位数字,并用「-」分隔成五组,每组分别有8、4、4、4、12的数字。例如:「550e8400-e29b-41d4-a716-446655440000」是一组完整的 UUID。

这里列了几种使用 JavaScript 产生 UUID / GUID的方法、优缺比较。

方法 1

最简单的方法就是使用 Math.random() 产出任意16进制数字,但

格式不符合 RFC4122 规范

Math.random() 产出的数字可能重复 (collision),保存前必须做比对
function _uuid() {
  function s4() {
    return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
  }
  return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
}
var uuid = _uuid(); //b3165466-df5b-c3d7-0e94-79d94e8c692f

接下来的方法都是基于 Math.random() 做改善,不管是改进格式或唯一性。

方法 2

先摆好格式,再利用 Math.random() 产出任意数字填入格式中。这个方法解决了方法 1 的格式问题,但仍可能有 collision。

function _uuid() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {var r = Math.random()*16|0,v=c=='x'?r:r&0x3|0x8;return v.toString(16);});
}
var uuid = _uuid(); //5fc84f46-5743-4ed3-a94d-1ba63b8022a5

方法 3

结合 time stamp 与方法 2,同时解决了格式和 collision 问题。

由于加上 Performance.now() (亚毫秒级的时间戳记),很难产生 collision。主流浏览器皆支持,但 IE 只支持 10 以上或 Edge。

function _uuid() {
  var d = Date.now();
  if (typeof performance !== 'undefined' && typeof performance.now === 'function'){
    d += performance.now(); //use high-precision timer if available
  }
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
    var r = (d + Math.random() * 16) % 16 | 0;
    d = Math.floor(d / 16);
      return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
  });
}

测试

for(var i = 0; i < 10; i++) {
  console.log(_uuid());
}
b382bd5-becd-4d93-8d3f-98aad78a049e
e3dea0f5-37f2-4d79-ae58-490af3228069
3e8d1c2b-f9f9-4a74-a8af-a4e8bebea438
eefbada8-efee-439a-af83-a80dde423dd6
8084d5dd-4f91-4590-927c-4751b49f2de0
06423d2c-1d62-429b-b6f9-de0a8d4ea95f
8b86b39e-5f2e-4abd-a8f0-2108a39a1d8a
62c8628e-e2e2-439d-80cd-b86e31e4bd59
1322e5db-91b0-4f12-94bd-fb4989d3cb95
0db3399e-55c3-44ba-822e-afcabf9b702b

到此这篇关于使用JavaScript生成UUID/GUID的三种方法的文章就介绍到这了,更多相关JavaScript生成UUID/GUID内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解iframe与frame的区别

    详解iframe与frame的区别

    Frame与Iframe两者可以实现的功能基本相同,不过Iframe比Frame具有更多的灵活性,通过本文给大家详解细节iframe与frame的区别,对iframe与frame的区别相关知识感兴趣的朋友一起学习吧
    2016-01-01
  • JavaScript中的逻辑判断符&&、||与!介绍

    JavaScript中的逻辑判断符&&、||与!介绍

    这篇文章主要介绍了JavaScript中的逻辑判断符&&、||与!介绍,本文讲解了逻辑与&&的处理规则、逻辑或||的处理规则、!操作符,需要的朋友可以参考下
    2014-12-12
  • 使用js实现的简单拖拽效果

    使用js实现的简单拖拽效果

    本文给大家分享的是使用纯JS实现的简单的拖拽效果的插件,算是对自己javascript学习的一个小的检验,如果小伙伴们需要复杂的拖拽效果,还是考虑jQuery的draggable吧,更成熟一些。
    2015-03-03
  • Bootstrap安装环境配置教程分享

    Bootstrap安装环境配置教程分享

    这篇文章主要为大家分享了Bootstrap安装环境配置教程,安装步骤非常简单,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 在IE8上JS实现combobox支持拼音检索功能

    在IE8上JS实现combobox支持拼音检索功能

    这篇文章主要介绍了在IE8上JS实现combobox支持拼音检索功能的相关资料,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2016-05-05
  • ES6入门教程之Array.from()方法

    ES6入门教程之Array.from()方法

    这篇文章主要给大家介绍了关于ES6入门教程之Array.from()方法的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ES6具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • JS常见内存泄漏及解决方案解析

    JS常见内存泄漏及解决方案解析

    这篇文章主要介绍了JS常见内存泄漏及解决方案解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 原生js实现拖拽移动与缩放效果

    原生js实现拖拽移动与缩放效果

    这篇文章主要为大家详细介绍了原生js实现拖拽移动与缩放效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • JavaScript中的各种宽高属性的实现

    JavaScript中的各种宽高属性的实现

    这篇文章主要介绍了JavaScript中的各种宽高属性的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • js中将URL中的参数提取出来作为对象的实现代码

    js中将URL中的参数提取出来作为对象的实现代码

    将URL中的参数提取出来作为对象的实现代码,适合希望获取url参数的朋友。
    2011-08-08

最新评论