javascript生成guid方法示例

发布时间:2019-12-19编辑:脚本学堂
本文介绍了javascript生成guid全局统一标识符的方法,原生javascript生成guid,感兴趣的朋友参考下。

什么是guid?

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个以上的十六进制随机数组成,并用系统时间转换为十六进制,这样虽然还是有可能重复,但是重复的概率极低,可忽略不计。