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 相关文章推荐
HTML中不支持静态Expando的元素的问题
Mar 08 Javascript
JS 时间显示效果代码
Aug 23 Javascript
jquery+ajax验证不通过也提交表单问题处理
Dec 12 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
Jun 08 Javascript
Javascript 6里的4个新语法
Aug 25 Javascript
使用JQuery中的trim()方法去掉前后空格
Sep 16 Javascript
Vue.js快速入门实例教程
Oct 15 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
Feb 20 Javascript
JavaScript中闭包的详解
Apr 01 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
Apr 27 Javascript
vue监听input标签的value值方法
Aug 27 Javascript
JavaScript中的各种宽高属性的实现
May 08 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 函数使用可变数量的参数方法
2017/05/02 PHP
PHP命名空间与自动加载类详解
2018/09/04 PHP
js function定义函数使用心得
2010/04/15 Javascript
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
理解javascript模块化
2016/03/28 Javascript
AngularJS的Filter的示例详解
2017/03/07 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
Angular 4依赖注入学习教程之ClassProvider的使用(三)
2017/06/04 Javascript
详解在vue-cli中使用路由
2017/09/25 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
2017/12/11 Javascript
微信小程序动态添加view组件的实例代码
2019/05/23 Javascript
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
Python实现冒泡,插入,选择排序简单实例
2014/08/18 Python
在Python中编写数据库模块的教程
2015/04/29 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
Python编程实现的图片识别功能示例
2017/08/03 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
在python中利用最小二乘拟合二次抛物线函数的方法
2018/12/29 Python
scrapy-redis源码分析之发送POST请求详解
2019/05/15 Python
Python 合并多个TXT文件并统计词频的实现
2019/08/23 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
2020/06/04 Python
在keras里实现自定义上采样层
2020/06/28 Python
HTML5 Canvas的事件处理介绍
2015/04/24 HTML / CSS
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
Linux中如何设置Java环境变量(Ubuntu)
2016/07/24 面试题
美容师的职业规划书
2013/12/27 职场文书
家长给学校的建议书
2014/05/15 职场文书
法人委托书范本
2014/09/15 职场文书
工作总结与自我评价
2014/09/18 职场文书
2014年大学团支部工作总结
2014/12/02 职场文书