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 相关文章推荐
动态改变textbox的宽高的js
Oct 26 Javascript
通过正则表达式实现表单验证是否为中文
Feb 18 Javascript
javascript实现在线客服效果
Jul 15 Javascript
jquery左右全屏大尺寸多图滑动效果代码分享
Aug 28 Javascript
js实现对table的增加行和删除行的操作方法
Oct 13 Javascript
JavaScript随机生成颜色的方法
Oct 15 Javascript
javascript监听页面刷新和页面关闭事件方法详解
Jan 09 Javascript
详解vue slot插槽的使用方法
Jun 13 Javascript
ES6新增的math,Number方法
Aug 06 Javascript
Three.js基础学习之场景对象
Sep 27 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
Aug 10 Javascript
详解JavaScript中的链式调用
Nov 27 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读取der格式证书乱码解决方法
2015/06/22 PHP
php微信公众号开发之答题连闯三关
2018/10/20 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
javascript fullscreen全屏实现代码
2009/04/09 Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
详解KOA2如何手写中间件(装饰器模式)
2018/10/11 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
Javascript基于OOP实实现探测器功能代码实例
2020/08/26 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
Python处理XML格式数据的方法详解
2017/03/21 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
Python3 修改默认环境的方法
2019/02/16 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
python标记语句块使用方法总结
2019/08/05 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
HTML5文档结构标签
2017/04/21 HTML / CSS
HTML5 Canvas 起步(2) - 路径
2009/05/12 HTML / CSS
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
法律专业应届生自荐信范文
2014/01/06 职场文书
护理助产毕业生的求职信
2014/03/02 职场文书
大学军训感言300字
2014/03/09 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
生物工程专业求职信
2014/09/03 职场文书
《暗黑破坏神2:重制版》本周进行第一轮A测 目前可官网进行申请报名
2021/04/07 其他游戏