Javascript生成全局唯一标识符(GUID,UUID)的方法


Posted in Javascript onFebruary 27, 2016

全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) 。

GUID是一种由算法生成的二进制长度为128位的数字标识符。GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中的 x 是 0-9 或 a-f 范围内的一个32位十六进制数。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。

GUID 的总数达到了2^128(3.4×10^38)个,所以随机生成两个相同GUID的可能性非常小,但并不为0。GUID一词有时也专指微软对UUID标准的实现。

在生成一些节点的时候需要通过唯一ID来标记,有如下高票答案可供参考

function generateUUID() {
var d = new Date().getTime();
var uuid = '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);
});
return uuid;
};

答案下面的评论云:这个方案下的碰撞率不及1/2^^122

另外给大家推荐几种算法

算法2

function guid() {
  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);
  });
}

算法3

function guid() {
  function S4() {
    return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
  }
  return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
}

算法4

function uuid(len, radix) {
  var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
  var uuid = [], i;
  radix = radix || chars.length;
 
  if (len) {
   // Compact form
   for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
  } else {
   // rfc4122, version 4 form
   var r;
 
   // rfc4122 requires these characters
   uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
   uuid[14] = '4';
 
   // Fill in random data. At i==19 set the high bits of clock sequence as
   // per rfc4122, sec. 4.1.5
   for (i = 0; i < 36; i++) {
    if (!uuid[i]) {
     r = 0 | Math.random()*16;
     uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
    }
   }
  }
 
  return uuid.join('');
}

这个可以指定长度和基数。比如

// 8 character ID (base=2)
uuid(8, 2) // "01001010"
// 8 character ID (base=10)
uuid(8, 10) // "47473046"
// 8 character ID (base=16)
uuid(8, 16) // "098F4D35"

算法5

function uuid() {
  var s = [];
  var hexDigits = "0123456789abcdef";
  for (var i = 0; i < 36; i++) {
    s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
  }
  s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
  s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
  s[8] = s[13] = s[18] = s[23] = "-";
 
  var uuid = s.join("");
  return uuid;
}

当然了,个人还是推荐算法一的,小伙伴们可以根据自己的需求来进行选择。

Javascript 相关文章推荐
offsetParent 算法分析
Apr 05 Javascript
js实现两个值相加alert出来精确到指定位
Sep 25 Javascript
再探JavaScript作用域
Sep 24 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
Mar 24 Javascript
JavaScript实现的背景自动变色代码
Oct 17 Javascript
13个PHP函数超实用
Oct 21 Javascript
jQuery增加与删除table列的方法
Mar 01 Javascript
微信小程序之购物车功能
Sep 23 Javascript
对node.js中render和send的用法详解
May 14 Javascript
浅谈Node.js 沙箱环境
May 15 Javascript
小程序云开发实现数据库异步操作同步化
May 18 Javascript
微信小程序解析富文本过程详解
Jul 13 Javascript
JS原型、原型链深入理解
Feb 27 #Javascript
Javascript中Date类型和Math类型详解
Feb 27 #Javascript
原生javascript实现匀速运动动画效果
Feb 26 #Javascript
探索angularjs+requirejs全面实现按需加载的套路
Feb 26 #Javascript
JavaScript代码生成PDF文件的方法
Feb 26 #Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
Feb 26 #Javascript
自动完成的搜索框javascript实现
Feb 26 #Javascript
You might like
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
PhpStorm terminal无法输入命令的解决方法
2016/10/09 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
使用JQuery进行跨域请求
2010/01/25 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
javascript表格的渲染组件
2015/07/03 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
jQuery获取checkbox选中的值
2016/01/28 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
2016/05/09 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
Vue.js学习示例分享
2017/02/05 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
微信小程序实现文字跑马灯效果
2020/05/26 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
vuex存储token示例
2019/11/11 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
[01:30:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第二场 2月2日
2021/03/11 DOTA
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
用Python实现协同过滤的教程
2015/04/08 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
python 三元运算符使用解析
2019/09/16 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
CSS3实现简易版的刮刮乐效果
2016/09/27 HTML / CSS
世界上最伟大的马产品:Equiderma
2020/01/07 全球购物
园林设计专业毕业生求职信
2014/03/23 职场文书
自查自纠工作情况报告
2014/10/29 职场文书
公司离职证明标准格式
2014/11/18 职场文书
关于成立领导小组的通知
2015/04/23 职场文书
2015年会计人员工作总结
2015/05/22 职场文书
趣味运动会赞词
2015/07/22 职场文书
幼儿园家长心得体会
2016/01/21 职场文书