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 相关文章推荐
js一组验证函数
Dec 20 Javascript
javascript获取当前日期时间及其它操作函数
Jan 11 Javascript
js substring从右边获取指定长度字符串(示例代码)
Dec 23 Javascript
无刷新上传文件并返回自定义值
Jun 11 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
Dec 11 Javascript
使用Math.max,Math.min获取数组中的最值实例
Apr 25 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
Jul 02 Javascript
vue之将echart封装为组件
Jun 02 Javascript
vue实现的组件兄弟间通信功能示例
Dec 04 Javascript
React中this丢失的四种解决方法
Mar 12 Javascript
原生JavaScript实现随机点名表
Jan 14 Javascript
vue如何在data中引入图片的正确路径
Jun 05 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
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
php网页标题中文乱码的有效解决方法
2014/03/05 PHP
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
js最简单的拖拽效果实现代码
2010/09/24 Javascript
jQuery判断元素是否存在的可靠方法
2014/05/06 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
vue实现简单loading进度条
2018/06/06 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
微信小程序实现星级评价效果
2018/12/28 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
2019/01/24 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
JS实现炫酷雪花飘落效果
2020/08/19 Javascript
python3 实现的人人影视网站自动签到
2016/06/19 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
python 限制函数执行时间,自己实现timeout的实例
2019/01/12 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
python实现飞机大战项目
2020/03/11 Python
简述 Python 的类和对象
2020/08/21 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
外企测试工程师面试题
2015/02/01 面试题
Delphi笔试题
2016/11/14 面试题
《油菜花开了》教学反思
2014/02/22 职场文书
企业法人代表授权委托书
2014/10/02 职场文书
北京爱情故事观后感
2015/06/12 职场文书
vue实现Toast组件轻提示
2022/04/10 Vue.js