原生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,重复概率低至可忽略不计*/

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个以上的十六进制随机数组成,并用系统时间转换为十六进制,这样虽然还是有可能重复,但是重复的概率极低,可忽略不计。

Javascript 相关文章推荐
javascript 面向对象编程 万物皆对象
Sep 17 Javascript
jquery入门——事件机制之事件中的冒泡现象示例解释
Sep 12 Javascript
js返回前一页刷新本页重载页面
Jul 29 Javascript
javascript+HTML5的Canvas实现Lab单车动画效果
Aug 07 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
Nov 18 Javascript
artDialog+plupload实现多文件上传
Jul 19 Javascript
Laravel中常见的错误与解决方法小结
Aug 30 Javascript
JavaScript 是什么意思
Sep 22 Javascript
js实现下拉框效果(select)
Mar 28 Javascript
详解Vue.js Mixins 混入使用
Sep 15 Javascript
利用原生的JavaScript实现简单拼图游戏
Nov 18 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
Aug 13 Javascript
javascript动态控制服务器控件实例
Sep 05 #Javascript
setTimeout()递归调用不加引号出错的解决方法
Sep 05 #Javascript
jQuery动态创建html元素的常用方法汇总
Sep 05 #Javascript
jquery单行文字向上滚动效果的实现代码
Sep 05 #Javascript
Javascript保存网页为图片借助于html2canvas库实现
Sep 05 #Javascript
JavaScript立即执行函数的三种不同写法
Sep 05 #Javascript
JavaScript实现生成GUID(全局统一标识符)
Sep 05 #Javascript
You might like
提升PHP速度全攻略
2006/10/09 PHP
WAF的正确bypass
2017/01/05 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
Jquery模仿Baidu、Google搜索时自动补充搜索结果提示
2013/12/26 Javascript
js实现点击添加一个input节点
2014/12/05 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
2016/06/17 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
简单实现bootstrap导航效果
2017/02/07 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
JavaScript私有变量实例详解
2019/01/24 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
python制作花瓣网美女图片爬虫
2015/10/28 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
python3实现多线程聊天室
2018/12/12 Python
python3的数据类型及数据类型转换实例详解
2019/08/20 Python
Python流程控制 if else实现解析
2019/09/02 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
flask实现验证码并验证功能
2019/12/05 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
服装电子商务创业计划书
2014/01/30 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
公司担保书范文
2014/05/21 职场文书
光棍节联谊晚会活动策划书
2014/10/10 职场文书
2015年大学生社会实践评语
2015/03/26 职场文书
导游词之日月潭
2019/11/05 职场文书