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 相关文章推荐
学习YUI.Ext 第七天--关于View&amp;JSONView
Mar 10 Javascript
表单提交时自动复制内容到剪贴板的js代码
Mar 16 Javascript
有关于JS辅助函数inherit()的问题
Apr 07 Javascript
js中匿名函数的创建与调用方法分析
Dec 19 Javascript
jquery取消事件冒泡的三种方法(推荐)
May 28 Javascript
第三篇Bootstrap网格基础
Jun 21 Javascript
微信小程序 详解页面跳转与返回并回传数据
Feb 13 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
Apr 07 Javascript
jQuery+css last-child实现选择最后一个子元素操作示例
Dec 10 jQuery
每周一练 之 数据结构与算法(Stack)
Apr 16 Javascript
javascript实现获取中文汉字拼音首字母
May 19 Javascript
vue实现虚拟列表功能的代码
Jul 28 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
深入讲解PHP的Yii框架中的属性(Property)
2016/03/18 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
2017/05/17 PHP
用JavaScript获取DOM元素位置和尺寸大小的方法
2013/04/12 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
jQuery+Pdo编写login登陆界面
2016/08/01 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
微信小程序websocket聊天室的实现示例代码
2019/02/12 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
uni-app微信小程序登录授权的实现
2020/05/22 Javascript
JS中准确判断变量类型的方法
2020/06/01 Javascript
写了个监控nginx进程的Python脚本
2012/05/10 Python
Python中使用Flask、MongoDB搭建简易图片服务器
2015/02/04 Python
详解Python编程中time模块的使用
2015/11/20 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
2016/02/18 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
win7+Python3.5下scrapy的安装方法
2018/07/31 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
Python缓存技术实现过程详解
2019/09/25 Python
python自动识别文本编码格式代码
2019/12/26 Python
Python json格式化打印实现过程解析
2020/07/21 Python
Python判断变量是否是None写法代码实例
2020/10/09 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
李宁官方网店:中国运动品牌
2017/11/02 全球购物
怎样声明一个匿名的内部类
2016/06/01 面试题
中学教师管理制度
2014/01/14 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
2016关于学习党章的心得体会
2016/01/15 职场文书
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL