JavaScript生成GUID的多种算法小结


Posted in Javascript onAugust 18, 2013

全局唯一标识符(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标准的实现。

算法1

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;
}

算法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"
Javascript 相关文章推荐
参考:关于Javascript中实现暂停的几篇文章
Mar 04 Javascript
浅谈Javascript嵌套函数及闭包
Nov 09 Javascript
常规表格多表头查询示例
Feb 21 Javascript
javascript实现获取字符串hash值
May 10 Javascript
readonly和disabled属性的区别
Jul 26 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
May 27 Javascript
JavaScript中的事件委托及好处
Jul 12 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
Jan 03 Javascript
深入理解Javascript中的valueOf与toString
Jan 04 Javascript
微信小程序实现单选选项卡切换效果
Jun 19 Javascript
JS添加或删除HTML dom元素的方法实例分析
Mar 05 Javascript
详解Vue slot插槽
Nov 20 Vue.js
实测jquery data()如何存值
Aug 18 #Javascript
js兼容的placeholder属性详解
Aug 18 #Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
Aug 18 #Javascript
jquery验证表单中的单选与多选实例
Aug 18 #Javascript
JS+CSS实现一个气泡提示框
Aug 18 #Javascript
JS中for循序中延迟加载动态效果的具体实现
Aug 18 #Javascript
js实现动态添加、删除行、onkeyup表格求和示例
Aug 18 #Javascript
You might like
php foreach 参数强制类型转换的问题
2010/12/10 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
smarty模板引擎中自定义函数的方法
2015/01/22 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
prototype class详解
2006/09/07 Javascript
用JavaScript事件串连执行多个处理过程的方法
2007/03/09 Javascript
JavaScript中的Window窗口对象
2008/01/16 Javascript
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
javascript中不提供sleep功能如何实现这个功能
2014/05/27 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
Jquery日历插件制作简单日历
2015/10/28 Javascript
全面理解JavaScript中的继承(必看)
2016/06/16 Javascript
JS中BOM相关知识点总结(必看篇)
2016/11/22 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
JavaScript运动框架 多物体任意值运动(三)
2017/05/17 Javascript
详解.vue文件中监听input输入事件(oninput)
2017/09/19 Javascript
vue2+el-menu实现路由跳转及当前项的设置方法实例
2017/11/07 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
python开发之for循环操作实例详解
2015/11/12 Python
Python之列表的插入&amp;替换修改方法
2018/06/28 Python
TensorFlow实现Logistic回归
2018/09/07 Python
Python 存储字符串时节省空间的方法
2019/04/23 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
django中SMTP发送邮件配置详解
2019/07/19 Python
使用Python求解带约束的最优化问题详解
2020/02/11 Python
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
财务方面个人工作的自我评价
2013/12/28 职场文书
元旦晚会策划方案
2014/02/18 职场文书
大家访活动实施方案
2014/03/10 职场文书
幼儿园感恩节活动总结
2015/03/24 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis