原生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 相关文章推荐
20款超赞的jQuery插件 Web开发人员必备
Feb 26 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
Jun 27 Javascript
jQuery读取和设定KindEditor值的方法
Nov 22 Javascript
js实现简单的购物车有图有代码
May 26 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
Aug 25 Javascript
JS解决iframe之间通信和自适应高度的问题
Aug 24 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
Jul 20 jQuery
react-native动态切换tab组件的方法
Jul 07 Javascript
Vuejs监听vuex中值的变化的方法示例
Dec 02 Javascript
利用JavaScript将Excel转换为JSON示例代码
Jun 14 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
Aug 27 Javascript
前端vue如何使用高德地图
Nov 05 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面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
php cookies中删除的一般赋值方法
2011/05/07 PHP
基于php在各种web服务器的运行模式详解
2013/06/03 PHP
php防止sql注入简单分析
2015/03/18 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
WordPress 插件——CoolCode使用方法与下载
2007/07/02 Javascript
TopList标签和JavaScript结合两例
2007/08/12 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
2013/04/24 Javascript
IE8下String的Trim()方法失效的解决方法
2013/11/08 Javascript
再谈javascript原型继承
2014/11/10 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
js仿淘宝和百度文库的评分功能
2016/05/15 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
canvas绘制七巧板
2017/02/03 Javascript
jQuery实现可兼容IE6的滚动监听功能
2017/09/20 jQuery
r.js来合并压缩css文件的示例
2018/04/26 Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
2020/08/14 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
Python常用列表数据结构小结
2014/08/06 Python
Python实现远程调用MetaSploit的方法
2014/08/22 Python
在Python中利用Pandas库处理大数据的简单介绍
2015/04/07 Python
Python基于pillow判断图片完整性的方法
2016/09/18 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
python初步实现word2vec操作
2020/06/09 Python
美国鞋类购物网站:Shiekh Shoes
2016/08/21 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
介绍一下Ruby的特点
2013/01/20 面试题
建筑行业的大学生自我评价
2013/12/08 职场文书
环保建议书
2014/03/12 职场文书
总经理聘用协议书
2015/09/21 职场文书
字节飞书面试promise.all实现示例
2022/06/16 Javascript