原生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 相关文章推荐
js函数的延迟加载实现代码
Oct 11 Javascript
node.js超时timeout详解
Nov 26 Javascript
浅谈javascript 迭代方法
Jan 21 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
Jun 28 Javascript
JS ES6中setTimeout函数的执行上下文示例
Apr 27 Javascript
jQuery实现菜单栏导航效果
Aug 15 jQuery
zTree异步加载展开第一级节点的实现方法
Sep 05 Javascript
webpack将js打包后的map文件详解
Feb 22 Javascript
Nuxt升级2.0.0时出现的问题(小结)
Oct 08 Javascript
详解ES6 export default 和 import语句中的解构赋值
May 28 Javascript
jQuery事件委托代码实践详解
Jun 21 jQuery
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
Oct 14 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 HTML代码串截取代码
2008/12/29 PHP
php单例模式实现(对象只被创建一次)
2012/12/05 PHP
PHP清除数组中所有字符串两端空格的方法
2014/10/20 PHP
使用PHPMailer实现邮件发送代码分享
2014/10/23 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
PDO::getAttribute讲解
2019/01/28 PHP
flash调用js中的方法,让js传递变量给flash的办法及思路
2013/08/07 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
JavaScript jQuery 中定义数组与操作及jquery数组操作
2015/12/18 Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
2015/12/31 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
Angularjs在初始化未完毕时出现闪烁问题的解决方法分析
2016/08/05 Javascript
JS正则替换掉小括号及内容的方法
2016/11/29 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
jquery实现异步加载图片(懒加载图片一种方式)
2017/04/24 jQuery
快速搭建React的环境步骤详解
2017/11/06 Javascript
JS实现的贪吃蛇游戏完整实例
2019/01/18 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
2019/08/09 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
python 类对象和实例对象动态添加方法(分享)
2017/12/31 Python
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
python实现dijkstra最短路由算法
2019/01/17 Python
python使用tkinter库实现五子棋游戏
2019/06/18 Python
Python如何获取文件路径/目录
2020/09/22 Python
Python 多进程、多线程效率对比
2020/11/19 Python
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
Carter’s官方旗舰店:美国受欢迎的婴童服装品牌
2018/01/21 全球购物
Vita Fede官网:在意大利手工制作,在纽约市设计
2019/10/25 全球购物
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
爷爷追悼会答谢词
2014/01/24 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
优秀大学生事迹材料
2014/12/24 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers