如何在 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 集提供鹽值。