UUID(uuid)js 生成


全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) 。

GUID是一种由算法生成的二进制长度为128位的数字标识符。GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中的 x 是 0-9 或 a-f 范围内的一个32位十六进制数。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。

GUID 的总数达到了2^128(3.4×10^38)个,所以随机生成两个相同GUID的可能性非常小,但并不为0。GUID一词有时也专指微软对UUID标准的实现。

在生成一些节点的时候需要通过唯一ID来标记,有如下高票答案可供参考

 
/*
* Generate a random uuid.
*
* USAGE: Math.uuid(length, radix)
* length - the desired number of characters
* radix - the number of allowable values for each character.
*
* EXAMPLES:
* // No arguments - returns RFC4122, version 4 ID
* >>> Math.uuid()
* "92329D39-6F5C-4520-ABFC-AAB64544E172"
*
* // One argument - returns ID of the specified length
* >>> Math.uuid(15) // 15 character ID (default base=62)
* "VcydxgltxrVZSTV"
*
* // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)
* >>> Math.uuid(8, 2) // 8 character ID (base=2)
* "01001010"
* >>> Math.uuid(8, 10) // 8 character ID (base=10)
* "47473046"
* >>> Math.uuid(8, 16) // 8 character ID (base=16)
* "098F4D35"
*/
( function () {
// Private array of chars to use
var  CHARS =  '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' .split( '' );
 
Math.uuid =  function  (len, radix) {
var  chars = CHARS, uuid = [], i;
radix = radix || chars.length;
 
if  (len) {
// Compact form
for  (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
else  {
// rfc4122, version 4 form
var  r;
 
// rfc4122 requires these characters
uuid[8] = uuid[13] = uuid[18] = uuid[23] =  '-' ;
uuid[14] =  '4' ;
 
// Fill in random data. At i==19 set the high bits of clock sequence as
// per rfc4122, sec. 4.1.5
for  (i = 0; i < 36; i++) {
if  (!uuid[i]) {
r = 0 | Math.random()*16;
uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
}
}
}
 
return  uuid.join( '' );
};
 
// A more performant, but slightly bulkier, RFC4122v4 solution. We boost performance
// by minimizing calls to random()
Math.uuidFast =  function () {
var  chars = CHARS, uuid =  new  Array(36), rnd=0, r;
for  ( var  i = 0; i < 36; i++) {
if  (i==8 || i==13 || i==18 || i==23) {
uuid[i] =  '-' ;
else  if  (i==14) {
uuid[i] =  '4' ;
else  {
if  (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0;
r = rnd & 0xf;
rnd = rnd >> 4;
uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
}
}
return  uuid.join( '' );
};
 
// A more compact, but less performant, RFC4122v4 solution:
Math.uuidCompact =  function () {
return  'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' .replace(/[xy]/g,  function (c) {
var  r = Math.random()*16|0, v = c ==  'x'  ? r : (r&0x3|0x8);
return  v.toString(16);
});
};
})();
 
另外还有几种写法:
 
function  generateUUID() {
var  d =  new  Date().getTime();
var  uuid =  'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' .replace(/[xy]/g,  function (c) {
var  r = (d + Math.random()*16)%16 | 0;
d = Math.floor(d/16);
return  (c== 'x'  ? r : (r&0x3|0x8)).toString(16);
});
return  uuid;
};

答案下面的评论云:这个方案下的碰撞率不及1/2^^122

另外给大家推荐几种算法

算法2

 
function  guid() {
return  'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' .replace(/[xy]/g,  function (c) {
var  r = Math.random()*16|0, v = c ==  'x'  ? r : (r&0x3|0x8);
return  v.toString(16);
});
}

算法3

 
function  guid() {
function  S4() {
return  (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
return  (S4()+S4()+ "-" +S4()+ "-" +S4()+ "-" +S4()+ "-" +S4()+S4()+S4());
}

算法4

function  uuid(len, radix) {
var  chars =  '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' .split( '' );
var  uuid = [], i;
radix = radix || chars.length;
 
if  (len) {
// Compact form
for  (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
else  {
// rfc4122, version 4 form
var  r;
 
// rfc4122 requires these characters
uuid[8] = uuid[13] = uuid[18] = uuid[23] =  '-' ;
uuid[14] =  '4' ;
 
// Fill in random data. At i==19 set the high bits of clock sequence as
// per rfc4122, sec. 4.1.5
for  (i = 0; i < 36; i++) {
if  (!uuid[i]) {
r = 0 | Math.random()*16;
uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
}
}
}
 
return  uuid.join( '' );
}

这个可以指定长度和基数。比如

 
// 8 character ID (base=2)
uuid(8, 2)  // "01001010"
// 8 character ID (base=10)
uuid(8, 10)  // "47473046"
// 8 character ID (base=16)
uuid(8, 16)  // "098F4D35"

算法5

 
function  uuid() {
var  s = [];
var  hexDigits =  "0123456789abcdef" ;
for  ( var  i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] =  "4" // bits 12-15 of the time_hi_and_version field to 0010
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);  // bits 6-7 of the clock_seq_hi_and_reserved to 01
s[8] = s[13] = s[18] = s[23] =  "-" ;
 
var  uuid = s.join( "" );
return  uuid;
}

当然了,个人还是推荐算法一的,小伙伴们可以根据自己的需求来进行选择。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM