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 Select操作大集合
May 26 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
Dec 12 Javascript
jquery 关于event.target使用的几点说明介绍
Apr 26 Javascript
Js日期选择器并自动加入到输入框中示例代码
Aug 02 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
Sep 04 Javascript
node.js中格式化数字增加千位符的几种方法
Jul 03 Javascript
JavaScript模板引擎用法实例
Jul 10 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
Jul 10 Javascript
AngularJS equal比较对象实例详解
Sep 14 Javascript
基于JavaScript实现右键菜单和拖拽功能
Nov 28 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
Jul 05 Javascript
vue组件实现可搜索下拉框扩展
Oct 23 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守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
PHP网站建设的流程与步骤分享
2015/09/25 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
JObj预览一个JS的框架
2008/03/13 Javascript
IE6与IE7中,innerHTML获取param的区别
2009/03/15 Javascript
js 数值项目的格式化函数代码
2010/05/14 Javascript
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
jQuery提交多个表单的小例子
2013/06/30 Javascript
js改变embed标签src值的方法
2015/04/10 Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
2015/08/09 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
微信小程序实现动态列表项的顺序加载动画
2019/07/25 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
2020/05/13 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
[01:19:46]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
跟老齐学Python之Import 模块
2014/10/13 Python
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
python读取文件名称生成list的方法
2018/04/27 Python
对python字典元素的添加与修改方法详解
2018/07/06 Python
Python装饰器语法糖
2019/01/02 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
html5的画布canvas——画出简单的矩形、三角形实例代码
2013/06/09 HTML / CSS
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
英国Iceland杂货店:网上食品购物
2020/12/16 全球购物
一些Unix笔试题和面试题
2012/09/25 面试题
党章学习思想汇报
2014/01/14 职场文书
小学语文国培感言
2014/03/04 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
关于做家务的心得体会
2016/01/23 职场文书
用Python创建简易网站图文教程
2021/06/11 Python
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript