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 相关文章推荐
学习ExtJS Panel常用方法
Oct 07 Javascript
一个JS函数搞定网页标题(title)闪动效果
May 13 Javascript
js中的事件捕捉模型与冒泡模型实例分析
Jan 10 Javascript
Vue.JS入门教程之列表渲染
Dec 01 Javascript
原生JS实现图片轮播效果
Dec 26 Javascript
jQuery操作css样式
May 15 jQuery
几种响应式文字详解
May 19 Javascript
纯js实现的积木(div层)拖动功能示例
Jul 19 Javascript
JavaScript实现微信红包算法及问题解决方法
Apr 26 Javascript
Vue 设置axios请求格式为form-data的操作步骤
Oct 29 Javascript
vue 查看dist文件里的结构(多种方式)
Jan 17 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
Apr 29 Javascript
实测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
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
php中strtotime函数性能分析
2016/11/20 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
2020/06/03 PHP
js 绑定带参数的事件以及手动触发事件
2010/04/27 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
使用jQuery仿苹果官网焦点图特效
2014/12/23 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
2015/09/06 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
巧用jQuery选择器提高写表单效率的方法
2016/08/19 Javascript
js弹性势能动画之抛物线运动实例详解
2017/07/27 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
使用Angular自定义字段校验指令的方法示例
2019/02/01 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
vue柱状进度条图像的完美实现方案
2019/08/26 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
在vue中使用eslint,配合vscode的操作
2020/11/09 Javascript
windows下wxPython开发环境安装与配置方法
2014/06/28 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
2018/03/13 Python
Python输入二维数组方法
2018/04/13 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
python Yaml、Json、Dict之间的转化
2020/10/19 Python
HTML5学习笔记之History API
2015/02/26 HTML / CSS
HOTEL INFO英国:搜索全球酒店
2019/08/08 全球购物
美国手机支架公司:PopSockets
2019/11/27 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
《夹竹桃》教学反思
2014/04/20 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
先进个人推荐材料
2014/12/29 职场文书
Redis安装启动及常见数据类型
2021/04/14 Redis
Django实现WebSocket在线聊天室功能(channels库)
2021/09/25 Python