JavaScript生成唯一ID的幾種常用方法
前言
在 JavaScript 中生成唯一 ID(UUID)的方法有很多,根據(jù)場景需求(如唯一性強度、長度、可讀性等)可選擇不同方案。以下是幾種常用方法:
1. 簡單方案:時間戳 + 隨機數(shù)(適合一般場景)
利用當(dāng)前時間戳(毫秒級)結(jié)合隨機數(shù),實現(xiàn)簡單且碰撞概率較低:
function generateSimpleId() { // 時間戳(毫秒)+ 3位隨機數(shù),確保同一毫秒內(nèi)不重復(fù) return Date.now().toString(36) + Math.random().toString(36).substr(2, 3); } // 使用示例 console.log(generateSimpleId()); // 類似:"1h8t0d3-xyz"(36進制更短)
特點:
- 實現(xiàn)簡單,長度較短(約12-15位);
- 適合前端臨時標(biāo)識(如DOM元素ID、臨時緩存鍵);
- 高并發(fā)下可能有極低碰撞風(fēng)險(可增加隨機數(shù)長度降低概率)。
2. 標(biāo)準 UUID v4(推薦,通用性強)
UUID(通用唯一識別碼)是行業(yè)標(biāo)準,其中 v4 版本基于隨機數(shù)生成,碰撞概率極低(可忽略),格式為 8-4-4-4-12
共36位:
function generateUUID() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { const r = Math.random() * 16 | 0; const v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } // 使用示例 console.log(generateUUID()); // 類似:"f47ac10b-58cc-4372-a567-0e02b2c3d479"
特點:
- 符合 UUID 標(biāo)準,通用性強(后端、數(shù)據(jù)庫等場景兼容);
- 隨機數(shù)生成,碰撞概率極低(適合生產(chǎn)環(huán)境);
- 長度固定(36位),包含連字符,可讀性較好。
3. 更安全的隨機數(shù)(基于 crypto API)
瀏覽器環(huán)境下可使用 crypto.getRandomValues
生成加密級隨機數(shù),進一步降低碰撞風(fēng)險:
function generateSecureUUID() { const array = new Uint8Array(16); window.crypto.getRandomValues(array); // 符合 UUID v4 格式:第6位固定為4,第8位固定為8-11之間的值 array[6] = (array[6] & 0x0f) | 0x40; array[8] = (array[8] & 0x3f) | 0x80; return Array.from(array, byte => ('0' + (byte & 0xff).toString(16)).slice(-2)) .join('') .replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, '$1-$2-$3-$4-$5'); } // 使用示例 console.log(generateSecureUUID()); // 標(biāo)準UUID格式,隨機數(shù)更安全
特點:
- 隨機數(shù)質(zhì)量更高(加密級),適合安全性要求高的場景(如token、會話ID);
- 需瀏覽器支持
crypto
API(幾乎所有現(xiàn)代瀏覽器都支持); - 仍符合 UUID 標(biāo)準格式。
4. 短ID(適合需要短標(biāo)識的場景)
生成更短的唯一ID(如8-10位),可通過基數(shù)轉(zhuǎn)換(36進制/62進制)實現(xiàn):
function generateShortId(length = 8) { const chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; let id = ''; for (let i = 0; i < length; i++) { // 隨機取字符(使用crypto提高隨機性) const randomIndex = Math.floor(window.crypto.getRandomValues(new Uint32Array(1))[0] / (0xFFFFFFFF + 1) * chars.length); id += chars[randomIndex]; } return id; } // 使用示例 console.log(generateShortId()); // 類似:"xY3p7Q9z"
特點:
- 長度可控(默認8位,碰撞概率隨長度增加而降低);
- 包含大小寫字母和數(shù)字,可讀性較好;
- 適合URL參數(shù)、短鏈接等需要簡短標(biāo)識的場景。
選擇建議:
- 一般前端場景:優(yōu)先用 UUID v4(通用且可靠);
- 高安全性場景:用 crypto 生成的 UUID;
- 短標(biāo)識需求:用 短ID生成函數(shù)(注意長度與碰撞風(fēng)險平衡);
- 簡單臨時標(biāo)識:用 時間戳+隨機數(shù)(實現(xiàn)最簡單)。
這些方法基本能覆蓋大部分前端生成唯一ID的需求,可根據(jù)實際場景選擇。
總結(jié)
到此這篇關(guān)于JavaScript生成唯一ID的幾種常用方法的文章就介紹到這了,更多相關(guān)js生成唯一ID內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript?WebSocket實現(xiàn)實時雙向聊天
這篇文章主要為大家詳細介紹了如何基于JavaScript?WebSocket實現(xiàn)實時雙向聊天,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下2024-04-04詳解js中構(gòu)造流程圖的核心技術(shù)JsPlumb(2)
這篇文章主要介紹了js中構(gòu)造流程圖的核心技術(shù)JsPlumb,jsPlumb是一個強大的JavaScript連線庫,它可以將html中的元素用箭頭、曲線、直線等連接起來,適用于開發(fā)Web上的圖表、建模工具等,需要的朋友可以參考下2015-12-12element-ui組件輸入框之放大鏡搜索圖標(biāo)問題
這篇文章主要介紹了element-ui組件輸入框之放大鏡(搜索圖標(biāo))的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-11-11