JavaScript实现生成GUID(全局统一标识符)


Posted in Javascript onSeptember 05, 2014

GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成GUID的API。生成算法很有意思,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。GUID的唯一缺陷在于生成的结果串会比较大。

GUID的格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

大家都知道GUID在前端开发中用处不大,但如果需要插入某个ID,并且这个ID与后台对应等其它需要GUID的操作时,为了方便,我们还是可以生成一个GUID的。

一般在sql、java、C#等后台或数据库语言中生成GUID都很简单,而前端没有直接生成GUID的方法,只能自己手写一个。但由于GUID需要获取以太网卡的地址、以及纳秒级的时间等数字。而前端获取到这些信息比较困难(知道的童鞋请一定告诉我),而我们可以模拟实现生成GUID,代码如下:

/*
 * 功能:生成一个GUID码,其中GUID以14个以下的日期时间及18个以上的16进制随机数组成,GUID存在一定的重复概率,但重复概率极低,理论上重复概率为每10ms有1/(16^18),即16的18次方分之1,重复概率低至可忽略不计
 * 免责声明:此代码为作者学习专用,如在使用者在使用过程中因代码问题造成的损失,与作者没有任何关系
 * 日期:2014年9月4日
 * 作者:wyc
 */

 
function GUID() {
  this.date = new Date();

  /* 判断是否初始化过,如果初始化过以下代码,则以下代码将不再执行,实际中只执行一次 */
  if (typeof this.newGUID != 'function') {
    
    /* 生成GUID码 */
    GUID.prototype.newGUID = function() {
      this.date = new Date();
      var guidStr = '';
        sexadecimalDate = this.hexadecimal(this.getGUIDDate(), 16);
        sexadecimalTime = this.hexadecimal(this.getGUIDTime(), 16);
      for (var i = 0; i < 9; i++) {
        guidStr += Math.floor(Math.random()*16).toString(16);
      }
      guidStr += sexadecimalDate;
      guidStr += sexadecimalTime;
      while(guidStr.length < 32) {
        guidStr += Math.floor(Math.random()*16).toString(16);
      }
      return this.formatGUID(guidStr);
    }

    /*
     * 功能:获取当前日期的GUID格式,即8位数的日期:19700101
     * 返回值:返回GUID日期格式的字条串
     */
    GUID.prototype.getGUIDDate = function() {
      return this.date.getFullYear() + this.addZero(this.date.getMonth() + 1) + this.addZero(this.date.getDay());
    }

    /*
     * 功能:获取当前时间的GUID格式,即8位数的时间,包括毫秒,毫秒为2位数:12300933
     * 返回值:返回GUID日期格式的字条串
     */
    GUID.prototype.getGUIDTime = function() {
      return this.addZero(this.date.getHours()) + this.addZero(this.date.getMinutes()) + this.addZero(this.date.getSeconds()) + this.addZero( parseInt(this.date.getMilliseconds() / 10 ));
    }

    /*
    * 功能: 为一位数的正整数前面添加0,如果是可以转成非NaN数字的字符串也可以实现
     * 参数: 参数表示准备再前面添加0的数字或可以转换成数字的字符串
     * 返回值: 如果符合条件,返回添加0后的字条串类型,否则返回自身的字符串
     */
    GUID.prototype.addZero = function(num) {
      if (Number(num).toString() != 'NaN' && num >= 0 && num < 10) {
        return '0' + Math.floor(num);
      } else {
        return num.toString();
      }
    }

    /* 
     * 功能:将y进制的数值,转换为x进制的数值
     * 参数:第1个参数表示欲转换的数值;第2个参数表示欲转换的进制;第3个参数可选,表示当前的进制数,如不写则为10
     * 返回值:返回转换后的字符串
     */
    GUID.prototype.hexadecimal = function(num, x, y) {
      if (y != undefined) {
        return parseInt(num.toString(), y).toString(x);
      } else {
        return parseInt(num.toString()).toString(x);
      }
    }

    /*
     * 功能:格式化32位的字符串为GUID模式的字符串
     * 参数:第1个参数表示32位的字符串
     * 返回值:标准GUID格式的字符串
     */
    GUID.prototype.formatGUID = function(guidStr) {
      var str1 = guidStr.slice(0, 8) + '-',
        str2 = guidStr.slice(8, 12) + '-',
        str3 = guidStr.slice(12, 16) + '-',
        str4 = guidStr.slice(16, 20) + '-',
        str5 = guidStr.slice(20);
      return str1 + str2 + str3 + str4 + str5;
    }
  }
}

GUID 对象

只需要将其保存在一个JS文件中并引用即可。

然后我们只需要。

var guid = new GUID();


alert(guid.newGUID()); 

即可获取GUID码。

实现原理很简单,这里只是采用了系统时间与18个以上的十六进制随机数组成,并用系统时间转换为十六进制,这样虽然还是有可能重复,但是重复的概率极低,可忽略不计。

以上为本人写的生成GUID的方法,如有更好的方法可以告诉我,谢谢!

Javascript 相关文章推荐
javascript css styleFloat和cssFloat
Mar 15 Javascript
Jquery 表格合并的问题分享
Sep 17 Javascript
jQuery限制图片大小的方法
May 25 Javascript
AngularJS ng-bind-html 指令详解及实例代码
Jul 30 Javascript
vue插件tab选项卡使用小结
Oct 27 Javascript
JS使用tofixed与round处理数据四舍五入的区别
Oct 25 Javascript
js中let和var定义变量的区别
Feb 08 Javascript
node.js到底要不要加分号浅析
Jul 11 Javascript
bootstrap中的导航条实例代码详解
May 20 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
Nov 01 Javascript
关于vue利用postcss-pxtorem进行移动端适配的问题
Nov 20 Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
Aug 05 Javascript
JavaScript判断textarea值是否为空并给出相应提示
Sep 04 #Javascript
Firefox下无法正常显示年份的解决方法
Sep 04 #Javascript
window.location的重写及判断location是否被重写
Sep 04 #Javascript
js怎么覆盖原有方法实现重写
Sep 04 #Javascript
JS的location.href跳出框架打开新页面的方法
Sep 04 #Javascript
手机号码,密码正则验证
Sep 04 #Javascript
javascript中2个感叹号的用法实例详解
Sep 04 #Javascript
You might like
Win下如何安装PHP的APC拓展
2013/08/07 PHP
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
2015/03/26 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
解决IE6的PNG透明JS插件使用介绍
2013/04/17 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
js事件监听机制(事件捕获)总结
2014/08/08 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
2015/05/04 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
浅析JavaScript声明变量
2015/12/21 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
HTML5 js实现拖拉上传文件功能
2020/11/20 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
layui的table单击行勾选checkbox功能方法
2018/08/14 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
[55:42]VG vs VGJ.T 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python 调用VC++的动态链接库(DLL)
2008/09/06 Python
Python扩展内置类型详解
2018/03/26 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
Django实现列表页商品数据返回教程
2020/04/03 Python
Chemist Warehouse官方海外旗舰店:澳洲第一连锁大药房
2017/08/25 全球购物
大唐电信科技股份有限公司java工程师面试经历
2016/12/09 面试题
应届毕业生个人求职信范文
2014/01/29 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
工厂门卫岗位职责
2015/04/13 职场文书
公司年会主持词范文!
2019/05/07 职场文书
2019新员工试用期转正申请书3篇
2019/08/13 职场文书
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL