原生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 表单取值赋值的一些基本操作
Oct 11 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
Nov 19 Javascript
javascript垃圾收集机制与内存泄漏详细解析
Nov 11 Javascript
百度地图API之本地搜索与范围搜索
Jul 30 Javascript
jquery带翻页动画的电子杂志代码分享
Aug 21 Javascript
bootstrap使用validate实现简单校验功能
Dec 02 Javascript
基于jquery实现的鼠标悬停提示案例
Dec 11 Javascript
学习使用Bootstrap栅格系统
May 11 Javascript
让你彻底掌握es6 Promise的八段代码
Jul 26 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
Sep 13 Javascript
vue项目中api接口管理总结
Apr 20 Javascript
vue单元格多列合并的实现
Nov 26 Vue.js
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 Google的translate API代码
2008/12/10 PHP
PHP面向对象之旅:深入理解static变量与方法
2014/01/06 PHP
PHP读取文件的常见几种方法
2016/11/03 PHP
详解PHP中mb_strpos的使用
2018/02/04 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
记录几个javascript有关的小细节
2007/04/02 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
table insertRow、deleteRow定义和用法总结
2014/05/14 Javascript
Express.JS使用详解
2014/07/17 Javascript
js获取表格的行数和列数的方法
2015/10/23 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
Vue中的v-cloak使用解读
2017/03/27 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
AngularJS中的作用域实例分析
2018/05/16 Javascript
AngularJS ui-router刷新子页面路由的方法
2018/07/23 Javascript
从零开始搭建vue移动端项目到上线的步骤
2018/10/15 Javascript
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
Python ljust rjust center输出
2008/09/06 Python
详解Python数据分析--Pandas知识点
2019/03/23 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
Python转换时间的图文方法
2019/07/01 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
2020/07/27 Python
python实现简单的学生管理系统
2021/02/22 Python
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
美丽的现代设计家具:2Modern
2018/07/26 全球购物
求职自荐信
2013/12/14 职场文书
审计工作个人的自我评价
2013/12/25 职场文书
收银员的岗位职责范本
2014/02/04 职场文书
物理研修随笔感言
2014/02/14 职场文书
合作意向书范本
2014/03/31 职场文书
保研推荐信格式
2015/03/25 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
用python自动生成日历
2021/04/24 Python