原生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 相关文章推荐
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
Mar 05 Javascript
JavaScript动态改变表格单元格内容的方法
Mar 30 Javascript
jQuery中$(function() {});问题详解
Aug 10 Javascript
使用堆实现Top K算法(JS实现)
Dec 25 Javascript
Bootstrap项目实战之首页内容介绍(全)
Apr 25 Javascript
js实现拖拽上传图片功能
Aug 01 Javascript
微信小程序实现topBar底部选择栏效果
Jul 20 Javascript
微信小程序与后台PHP交互的方法实例分析
Dec 10 Javascript
微信小程序mpvue点击按钮获取button值的方法
May 29 Javascript
vue如何使用async、await实现同步请求
Dec 09 Javascript
JavaScript接口实现方法实例分析
May 16 Javascript
Node实现搜索框进行模糊查询
Jun 28 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
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
php switch语句多个值匹配同一代码块的实现
2014/03/03 PHP
一个PHP实现的轻量级简单爬虫
2015/07/08 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
PHP实现网站应用微信登录功能详解
2019/04/11 PHP
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
2015/10/12 Javascript
JavaScript入门教程之引用类型
2016/05/04 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
一次让你了解全部JavaScript的作用域
2019/06/24 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
python通过smpt发送邮件的方法
2015/04/30 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
Casetify官网:自制专属手机壳、iPad护壳和Apple Watch手表带
2018/05/09 全球购物
C#笔试题和英文面试题
2013/02/07 面试题
如何利用cmp命令比较文件
2013/09/23 面试题
文艺晚会主持词
2014/03/24 职场文书
成品库仓管员岗位职责
2014/04/06 职场文书
投资协议书范本
2014/04/21 职场文书
环保倡议书50字
2014/05/15 职场文书
推广普通话演讲稿
2014/05/23 职场文书
工作目标责任书
2014/07/23 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
就业推荐表自我评价范文
2015/03/02 职场文书
雨中的树观后感
2015/06/03 职场文书
南极大冒险观后感
2015/06/05 职场文书
交通安全学习心得体会
2016/01/18 职场文书
Python anaconda安装库命令详解
2021/10/16 Python