原生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 DOM 学习第三章 内容表格
Feb 19 Javascript
jquery利用event.which方法获取键盘输入值的代码
Oct 09 Javascript
jquery插件validate验证的小例子
May 08 Javascript
JS将光标聚焦在文本最后的实现代码
Mar 28 Javascript
JavaScript自定义等待wait函数实例分析
Mar 23 Javascript
javascript省市区三级联动下拉框菜单实例演示
Nov 29 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
Aug 17 Javascript
浅析Ajax语法
Dec 05 Javascript
vue使用 better-scroll的参数和方法详解
Jan 25 Javascript
React router动态加载组件之适配器模式的应用详解
Sep 12 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
Sep 26 Javascript
解决vant中 tab栏遇到的坑 van-tabs
Nov 04 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
ThinkPHP安装和设置
2015/07/27 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
PHP实现字符串的全排列详解
2019/04/24 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
JS解析XML的实现代码
2009/11/12 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
使用JS读秒使用示例
2013/09/21 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
浅谈javascript中createElement事件
2014/12/05 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
ES6学习之变量的两种命名方法示例
2017/07/18 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
vue添加axios,并且指定baseurl的方法
2018/09/19 Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
2018/12/14 Javascript
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
在vue-cli中引入lodash.js并使用详解
2019/11/13 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
Python 第一步 hello world
2009/09/25 Python
浅析python继承与多重继承
2018/09/13 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
2020/02/09 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
日本著名的服饰鞋帽综合类购物网站:MAGASEEK
2019/01/09 全球购物
长青弘远的面试题
2012/06/09 面试题
建筑设计专业求职自我评价
2014/03/02 职场文书
2014保险公司内勤工作总结
2014/12/16 职场文书
工作经历证明范本
2015/06/15 职场文书
第四次工业革命,打工人与机器人的竞争
2022/04/21 数码科技
详细介绍Next.js脚手架完整搭建封装
2022/04/26 Javascript
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript