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模仿淘宝的图片放大镜显示效果
Sep 15 Javascript
使用jquery获取网页中图片高度的两种方法
Sep 26 Javascript
javascript 获取网页标题代码实例
Jan 22 Javascript
js中小数转换整数的方法
Jan 26 Javascript
全面解析Bootstrap排版使用方法(文字样式)
Nov 30 Javascript
通用无限极下拉菜单的实现代码
May 31 Javascript
深入理解javascript作用域第二篇之词法作用域和动态作用域
Jul 24 Javascript
微信小程序 支付简单实例及注意事项
Jan 06 Javascript
微信小程序 实现动态显示和隐藏某个控件
Apr 27 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
Jun 26 Javascript
通过微信公众平台获取公众号文章的方法示例
Dec 25 Javascript
Node.js API详解之 V8模块用法实例分析
Jun 05 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
第二节--PHP5 的对象模型
2006/11/16 PHP
用PHP实现图象锐化代码
2007/06/14 PHP
PHP中常用数组处理方法实例分析
2008/08/30 PHP
PHP仿盗链代码
2012/06/03 PHP
PHP引用的调用方法分析
2016/04/25 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
巧用局部变量提升javascript性能
2014/02/24 Javascript
ExpressJS入门实例
2015/01/14 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
2016/08/29 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
js实现简单模态框实例
2018/11/16 Javascript
vue+iview/elementUi实现城市多选
2019/03/28 Javascript
js实现计算器功能
2020/08/10 Javascript
[02:39]DOTA2英雄基础教程 极限穿梭编织者
2013/12/05 DOTA
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
python 实时遍历日志文件
2016/04/12 Python
浅谈Python 中整型对象的存储问题
2016/05/16 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
对python:print打印时加u的含义详解
2018/12/15 Python
flask应用部署到服务器的方法
2019/07/12 Python
Django 实现图片上传和显示过程详解
2019/07/18 Python
python3.7 sys模块的具体使用
2019/07/22 Python
Python 元组拆包示例(Tuple Unpacking)
2019/12/24 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
基于python实现判断字符串是否数字算法
2020/07/10 Python
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
大四本科生的自我评价
2013/12/30 职场文书
暑假家长评语大全
2014/04/17 职场文书
2014年百日安全生产活动总结
2014/05/04 职场文书
2014县委书记党的群众路线教育实践活动对照检查材料思想汇报
2014/09/22 职场文书
师德师风整改措施
2014/10/24 职场文书