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 面向对象继承
Nov 26 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
Dec 04 Javascript
js实现键盘控制DIV移动的方法
Jan 10 Javascript
javascript每日必学之循环
Feb 19 Javascript
Bootstrap每天必学之响应式导航、轮播图
Apr 25 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
Dec 05 Javascript
JS实现全屏的四种写法
Dec 30 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
Jan 11 Javascript
纯JS实现简单的日历
Jun 26 Javascript
AngularJS表单验证功能
Oct 19 Javascript
Vue中props的使用详解
Jun 15 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
Aug 12 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 伪造本地文件包含漏洞的代码
2011/11/03 PHP
PHP文件注释标记及规范小结
2012/04/01 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
PHP缓存机制Output Control详解
2014/07/14 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
2020/06/28 PHP
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
详解Vuejs2.0之异步跨域请求
2017/04/20 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
2017/08/22 Javascript
Vue filter介绍及其使用详解
2017/10/21 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
以v-model与promise两种方式实现vue弹窗组件
2018/05/21 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
分享一个简单的python读写文件脚本
2017/11/25 Python
python学习入门细节知识点
2018/03/29 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
python能做哪些生活有趣的事情
2020/09/09 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
优秀德育工作者事迹材料
2014/05/07 职场文书
触电现场处置方案
2014/05/14 职场文书
保护动物的标语
2014/06/11 职场文书
国际商务专业求职信
2014/07/15 职场文书
诚信承诺书
2015/01/19 职场文书
英文感谢信格式
2015/01/21 职场文书
高一军训决心书
2015/02/05 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL