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 相关文章推荐
JS中动态添加事件(绑定事件)的代码
Jan 09 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
Dec 01 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
May 03 Javascript
JavaScript希尔排序、快速排序、归并排序算法
May 08 Javascript
JS简单实现无缝滚动效果实例
Aug 24 Javascript
利用Vue.js指令实现全选功能
Sep 08 Javascript
js获取时间函数及扩展函数的方法
Oct 30 Javascript
jQuery绑定事件的四种方式介绍
Oct 31 Javascript
axios的拦截请求与响应方法
Aug 11 Javascript
最简单的vue消息提示全局组件的方法
Jun 16 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
Jul 19 Javascript
vue缓存之keep-alive的理解和应用详解
Nov 02 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 方便水印和缩略图的图形类
2009/05/21 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
Yii框架自定义数据库操作组件示例
2019/11/11 PHP
判断脚本加载是否完成的方法
2009/05/26 Javascript
javascript转换字符串为dom对象(字符串动态创建dom)
2010/05/10 Javascript
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
js自动下载文件到本地的实现代码
2013/04/28 Javascript
JS获取键盘上任意按键的值(实例代码)
2013/11/12 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
2015/05/06 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
jQuery实现放大镜效果实例代码
2016/03/17 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
Vue自定义事件(详解)
2017/08/19 Javascript
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
2017/09/08 Python
python使用SMTP发送qq或sina邮件
2017/10/21 Python
微信跳一跳辅助python代码实现
2018/01/05 Python
使用Python读取大文件的方法
2018/02/11 Python
Python利用heapq实现一个优先级队列的方法
2019/02/03 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
Python 内置函数globals()和locals()对比详解
2019/12/23 Python
PyTorch中的Variable变量详解
2020/01/07 Python
Python实现自动访问网页的例子
2020/02/21 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
2020/06/08 Python
上班睡觉检讨书
2014/01/09 职场文书
婚礼主持结束词
2014/03/13 职场文书
小班下学期个人总结
2015/02/12 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS
volatile保证可见性及重排序方法
2022/08/05 Java/Android