如何在 JavaScript 中创建 GUID/UUID?


全局唯一标识符 (GUID) 或 (通用唯一标识符) UUID 是一个 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 的方法。这是快速方法,在这种方法中,UUID 字符串通过生成 2 到 15 之间的数字来生成两半。稍后可以进行重新格式化。

示例

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 参数来为生成更可能不同的新 UUID 集提供盐值。

Arnab Chakraborty
Arnab Chakraborty

企业培训师

更新于:2023年4月4日

11K+ 浏览量

启动您的职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.