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 相关文章推荐
JQuery Tips(3) 关于$()包装集内元素的改变
Dec 14 Javascript
深入理解JavaScript作用域和作用域链
Oct 21 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
Jun 04 Javascript
js中定义一个变量并判断其是否为空的方法
May 13 Javascript
基于JavaScript实现文字超出部分隐藏
Feb 29 Javascript
Node.js中的http请求客户端示例(request client)
May 04 Javascript
浅谈对Angular中的生命周期钩子的理解
Jul 31 Javascript
node中间层实现文件上传功能
Jun 11 Javascript
浅谈Vue render函数在ElementUi中的应用
Sep 06 Javascript
js中实例与对象的区别讲解
Jan 21 Javascript
ES6 十大特性简介
Dec 09 Javascript
用Javascript实现发送短信验证码间隔功能
Feb 08 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 中文字符入库或显示乱码问题的解决方法
2010/04/12 PHP
在php中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
2014/10/30 PHP
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
jquery实现div拖拽宽度示例代码
2013/07/31 Javascript
js控制input输入字符解析
2013/12/27 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
jQuery中offset()方法用法实例
2015/01/16 Javascript
限制上传文件大小和格式的jQuery插件实例
2015/01/24 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
Vuex和前端缓存的整合策略详解
2017/05/09 Javascript
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
Python复制文件操作实例详解
2015/11/10 Python
Python实现二叉搜索树
2016/02/03 Python
python数据结构之列表和元组的详解
2017/09/23 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
2018/05/24 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
python程序需要编译吗
2020/06/19 Python
python属于哪种语言
2020/08/16 Python
python UDF 实现对csv批量md5加密操作
2021/01/01 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
华为消费者德国官方网站:HUAWEI德国
2020/11/03 全球购物
中专毕业生自我鉴定范文
2013/11/09 职场文书
银行员工职业规划范文
2014/01/21 职场文书
教学改革实施方案
2014/03/31 职场文书
大学学风建设方案
2014/05/04 职场文书
2014教师研修学习体会
2014/07/08 职场文书
2014保险公司内勤工作总结
2014/12/16 职场文书
工作态度检讨书范文
2015/05/06 职场文书
2016中秋节月饼促销广告语
2016/01/28 职场文书
MySQL中InnoDB存储引擎的锁的基本使用教程
2021/05/26 MySQL
nginx刷新页面出现404解决方案(亲测有效)
2022/03/18 Servers