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 相关文章推荐
JavaScript 对象、函数和继承
Jul 07 Javascript
jquery选择器、属性设置用法经验总结
Sep 08 Javascript
将中国标准时间转换成标准格式的代码
Mar 20 Javascript
jquery实现保存已选用户
Jul 21 Javascript
JavaScript基本语法讲解
Jun 03 Javascript
清除js缓存的多种方法总结
Dec 09 Javascript
vue.js的提示组件
Mar 02 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
Mar 28 jQuery
JavaScript输入分钟、秒倒计时技巧总结(附代码)
Aug 17 Javascript
安装vue-cli报错 -4058 的解决方法
Oct 19 Javascript
详解Node.js异步处理的各种写法
Jun 09 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
Oct 24 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连接函数implode与分割explode的深入解析
2013/06/26 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
2014/06/23 PHP
PHP中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
ThinkPHP路由机制简介
2016/03/23 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
JS解析XML的实现代码
2009/11/12 Javascript
jQuery 幻灯片插件(带缩略图功能)
2011/01/24 Javascript
js Function类型
2011/12/04 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
Javascript中设置默认参数值示例
2014/09/11 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
2016/12/29 Javascript
Vue.js实战之Vuex的入门教程
2017/04/01 Javascript
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
JS原型继承四步曲及原型继承图一览
2017/11/28 Javascript
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
[04:52]2015国际邀请赛LGD战队晋级之路
2015/08/14 DOTA
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
python实现维吉尼亚加密法
2019/03/20 Python
Python对HTML转义字符进行反转义的实现方法
2019/04/28 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
环境科学专业大学生自荐信格式
2013/09/21 职场文书
说明书格式及范文
2014/05/07 职场文书
入党转正申请书范文
2019/05/20 职场文书
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL
maven依赖的version声明控制方式
2022/01/18 Java/Android