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.ui.dialog 增加“自动记住关闭时的位置”的功能
Nov 24 Javascript
JavaScript中输出标签的方法
Aug 27 Javascript
jquery实现动态画圆
Dec 04 Javascript
js实现a标签超链接提交form表单的方法
Jun 24 Javascript
js 获取站点应用名的简单实例
Aug 18 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
Oct 09 Javascript
Bootstrap Table使用整理(四)之工具栏
Jun 09 Javascript
jQuery使用zTree插件实现可拖拽的树示例
Sep 23 jQuery
Vue props用法详解(小结)
Jul 03 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
Aug 24 Javascript
JS原生瀑布流效果实现
Apr 26 Javascript
Json实现传值到后台代码实例
Jun 30 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/06/09 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
ExtJS下grid的一些属性说明
2009/12/13 Javascript
google 搜索框添加关键字实现代码
2010/04/24 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
javascript实现unicode与ASCII相互转换的方法
2015/12/10 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
JavaScript编写九九乘法表(两种任选)
2017/02/04 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
Node.js系列之安装配置与基本使用(1)
2019/08/30 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
2020/09/17 Javascript
Python爬虫框架Scrapy安装使用步骤
2014/04/01 Python
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
Python中.join()和os.path.join()两个函数的用法详解
2018/06/11 Python
python矩阵的转置和逆转实例
2018/12/12 Python
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
英国最大的婴儿监视器网上商店:Baby Monitors Direct
2018/04/24 全球购物
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
机电专业大学生求职信
2013/10/04 职场文书
小学教师的个人自我鉴定
2013/10/26 职场文书
求职自荐信范文格式
2013/11/29 职场文书
教你打造完美的创业计划书
2014/01/06 职场文书
班主任班级寄语大全
2014/04/04 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
2016年敬老月活动总结
2016/04/05 职场文书
Python3的进程和线程你了解吗
2022/03/16 Python