如何在 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+ 瀏覽量

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告