JavaScript 如何创建GUID / UUID
全球唯一标识符(GUID)或(通用唯一标识符)是一个16字节或128位二进制值,用作软件构建的标识符标准。该128位数字通过使用十六进制字符串的规范格式表示为可以读的人类格式。一个示例是:de305d84-75c4-431d-acc2-eb6b0e5f6014。在本文中,我们将介绍如何使用javascript功能生成GUID或UUID。有几种不同的方法,依次介绍:
通过使用随机数生成
示例
function generate_uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,
function(c) {
var uuid = Math.random() * 16 | 0, v = c == 'x' ? uuid : (uuid & 0x3 | 0x8);
return uuid.toString(16);
});
}
for(var i = 0; i<5; i++) {
console.log( "A sample GUID / UUID: ",generate_uuidv4() );
}
输出
A sample GUID / UUID: 3b869420-6618-43dd-a351-6373ed8ffb48
A sample GUID / UUID: 5d3459b9-d5f1-49ca-a356-d315b314b7eb
A sample GUID / UUID: 19d3ea72-24c7-46e8-177c-a052eb9bc677
A sample GUID / UUID: e3f70fb6-951a-4ee1-b3a2-3173bf7e3a91
A sample GUID / UUID: eac986d7-2d1d-40a4-29eb-92eb131bd0cc
在上面的示例中,我们使用随机数生成器生成了五个UUID。由于上述方法依赖于Math.Random()函数,因此这可以用来生成GUID或UUID,但这不是一个高质量的随机数生成器。始终有可能通过相同的随机数碰撞两个UUID。对Math.Random()进行微小的改动可以使其成为更可靠的UUID或GUID生成器。在这种情况下,我们可以将日期和时间与之结合。
示例
function generate_uuidv4() {
var dt = new Date().getTime();
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,
function( c ) {
var rnd = Math.random() * 16;//random number in range 0 to 16
rnd = (dt + rnd)%16 | 0;
dt = Math.floor(dt/16);
return (c === 'x' ? rnd : (rnd & 0x3 | 0x8)).toString(16);
});
}
for(var i = 0; i<5; i++) {
console.log( "A sample GUID / UUID: ",generate_uuidv4() );
}
输出结果
A sample GUID / UUID: 7a83193c-9624-48e2-a223-e910878c89c5
A sample GUID / UUID: c8e49a59-16a4-4d22-97fc-cdafffba2707
A sample GUID / UUID: 7feea4a6-59d5-4f0e-b7b7-b5cd2069fa0f
A sample GUID / UUID: f244e83c-5af5-483b-8fdd-39d56c6b16ee
A sample GUID / UUID: bc2e2167-91d5-4f53-afc3-af9efdc14e56
让我们看另一种通过使用伪随机数生成GUID / UUID的方法。 在这个示例中,生成一个随机的16位十六进制字符序列,然后对指定的位置进行处理(对于位置12到15,设置为4),(对于位置6-7,放入常数01)。 并且在适当的位置插入连字符(“-”)以保持正确的格式。
通过使用伪随机数
示例
function generate_uuidv4() {
var id_str = [];
var hxDigits = "0123456789abcdef";
for (var i = 0; i < 36; i++) {
id_str[i] = hxDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
id_str[14] = "4"; // bits 12-15 is for time_hi_and_version field, set to to 0010
id_str[19] = hxDigits.substr((id_str[19] & 0x3) | 0x8, 1); // bits 6-7 for the clock_seq_hi_and_reserved to 01
id_str[8] = id_str[13] = id_str[18] = id_str[23] = "-";
var guid = id_str.join("");
return guid;
}
for(var i = 0; i<5; i++) {
console.log( "A sample GUID / UUID: ",generate_uuidv4() );
}
输出结果
A sample GUID / UUID: b5106962-5bc5-46dc-b74e-7a3fd0584fc0
A sample GUID / UUID: 5fdfa0e1-4251-4ae6-bafc-b162e032ab48
A sample GUID / UUID: de644da7-2dc4-499f-82fa-618f5b6f133e
A sample GUID / UUID: cc5ce77f-18dd-46ba-8762-1cc7cf9c7a7f
A sample GUID / UUID: 1708db50-0d8d-4fcc-8e7e-5cfc23387c6f
让我们来看看另一种方法来生成GUID / UUID,通过使用伪随机数生成。这是一种快速方法,在这种方法中,通过生成2到15之间的数字来生成UUID字符串的两个半部分。重新格式化可以稍后进行。
示例
function generate_uuidv4() {
return Math.random().toString(36).substring(2, 15) +
Math.random().toString(36).substring(2, 15);
}
for(var i = 0; i<5; i++) {
console.log( "A sample GUID / UUID: ",generate_uuidv4() );
}
输出
A sample GUID / UUID: 8kyxdvlm8by3licwpf081c
A sample GUID / UUID: coemu70fbbw9e8gsvvw8aq
A sample GUID / UUID: 41kamutwz52izjiw1h769
A sample GUID / UUID: r3e4app5nfsphj3wa7sa8
A sample GUID / UUID: 463olfnw767sr9hy0hlcn
结论
UUID或GUID被用作全球标识符标准。它们是128位(16字节)的二进制字符串,具有不同的段落。有很多不同的方法可以通过JavaScript生成UUID / GUID。这里详细描述了基于随机数生成的方法。在第一个方法中,使用了简单的Math.Random()函数,但是由于该函数可能会两次生成相同的数字,所以使用了DateTime参数为生成新的一组UUIDs提供一个盐,这样它们更有可能是不同的。