UUID v4 或 v7:該用哪一種,為什麼重要
需要隨機識別碼、別無他求時,用 UUID v4。當識別碼會作為資料庫的鍵,或希望 ID 能依建立時間排序時,用 UUID v7。兩者都是 128 位元,寫法都是相同的 36 個字元,差別在於位元如何排列。下方的 UUID 產生器 可以在瀏覽器中產生任一版本,一次最多 500 個。
UUID 產生器需要為程式碼產生不重複的 ID免費使用UUID 長什麼樣子
UUID(通用唯一識別碼)是一個 128 位元的數字,寫成 32 個十六進位數字,分成五組,每組依序為 8、4、4、4、12 個數字,中間以連字號隔開。例如 3f2b8c1e-6d4a-4f7b-9c2e-8a1d5e0b7f63。
其中有兩個部分是固定的。四個位元存放版本,所以第三組開頭是 4(v4)或 7(v7)。兩個位元存放變體,所以第四組開頭是 8、9、a 或 b。其餘位元才是識別碼本身。正因為有這些版本與變體位元,v4 UUID 實際上只有 122 個隨機位元,而不是 128 個。
UUID v4:隨機
v4 UUID 除了那些固定位元外都是隨機的。它的 122 個隨機位元讓重複幾乎不可能發生。假設你產生十億個 v4 UUID,任兩個相同的機率大約是 n 的平方除以可能值數量的兩倍,約為 10 的負 19 次方。換句話說,碰撞不是你需要特別設計去防範的問題。
這個估算假設產生器是從密碼學等級的隨機來源取得位元。如果產生器可以被預測,這個估算就不成立。本工具使用瀏覽器的密碼學隨機來源,透過 crypto.randomUUID 或 crypto.getRandomValues 取得。
UUID v7:時間優先
v7 由 RFC 9562 定義。它的前 48 個位元存放以毫秒計的 Unix 時間,所以較晚建立的 ID,前半段數值會比較早建立的大。接著是版本位元、隨機位元、變體位元,以及更多隨機位元。隨機空間中有一部分可以用來存放計數器,當同一毫秒內要建立多個 ID 時,可以保持它們的順序。
因為時間排在最前面,只要以一致的大小寫把 v7 ID 當作文字排序,就能依建立時間排序,精確到毫秒。這之所以成立,是因為十六進位數字的位數固定,而時間位於開頭的字元。
時間也是看得到的。任何人讀取 v7 UUID,都能大致看出它是什麼時候建立的。你可以用 UUID 產生器 中的「檢查」欄位自行驗證,它會把前 48 個位元還原成日期與時間。
為什麼 v7 適合資料庫索引
資料庫索引通常是 B 樹(B-tree),也就是依鍵值保持排序的結構。如果鍵是隨機的,例如 v4,每一筆新資料都會落在索引中的隨機位置。資料庫就必須寫入索引的許多不同區段,造成更多頁面分裂與快取未命中。在大型資料表上,這些額外的工作會不斷累積。
v7 鍵的時間部分會持續增長,因此它幾乎比索引中既有的每個鍵都大。新資料會加在索引的尾端,很像自動遞增的數字。近期的索引頁能留在記憶體中,寫入也比較乾淨。這種差異在持續成長的大型資料表上最明顯,在小型資料表上則幾乎察覺不到。
v4 與 v7 怎麼選
- 資料庫主鍵,或任何會隨時間成長的資料表:選 v7。索引能保持有序。
- 經常依時間排序的日誌、事件或訊息:選 v7,因為 ID 本身就帶有順序。
- 對外公開、且建立時間應保持隱密的 ID:選 v4。v7 ID 會洩露建立時間。
- 大量裝置而時鐘不可靠:v4 與 v7 都能保持唯一,因為由隨機位元負責這件事。只有 v7 的排序會依賴時鐘準確。
兩個版本都是標準,但較舊的函式庫可能只支援 v4。RFC 4122 多年來定義了版本 1 到 5。RFC 9562 於 2024 年 5 月發布,取代 RFC 4122,並定義了版本 6、7 與 8。在依賴某個函式庫之前,請先確認它支援 v7。
儲存 UUID
以文字寫出的 UUID 佔 36 個字元。它的 16 個位元組可以以二進位形式儲存,所占空間少得多。許多資料庫為此提供原生的 UUID 型別或 16 位元組的二進位欄位,而且比較速度比文字快。
選定一種格式後就維持下去。大寫、小寫、連字號與大括號,對人來說都是同一個 UUID,但資料庫或字串比對可能把它們視為不同的值。產生器提供的大寫、不含連字號與大括號等選項,就是為了需要這些格式的系統準備的。
不要把 UUID 當作秘密
UUID 是識別碼,不是密碼、工作階段權杖或存取金鑰。它的設計目標是唯一,而不是不可猜測。v7 UUID 還會帶著建立時間。再加上識別碼常被貼到連結、日誌、電子郵件與螢幕截圖中,任何看到的人都可能重複使用。
存取控制應該放在伺服器端。知道某個 ID 的人,不應該自動被允許查看或修改它所指向的紀錄。若需要密碼、通行片語或權杖,請使用專為祕密設計的產生器。密碼產生器 會在你的裝置上以安全的隨機性產生隨機密碼或單字通行片語,並估算其強度。若想了解長度與隨機性為什麼重要,可以閱讀強密碼與熵。
使用工具
- 隨機 ID 選第 4 版,依時間排序的 ID 選第 7 版。
- 設定數量,一次從 1 到 500 個。
- 若你的程式碼需要特定格式,勾選大寫、不含連字號或大括號。
- 全部複製,或將清單下載為 .txt 檔案。
- 把任一 UUID 貼到「檢查」欄位下,即可讀出它的版本、變體,以及(若為 v7)內含的時間。
快速解答
v4 UUID 是唯一的嗎? 實際上是。它的 122 個隨機位元使重複的機率低到你不需要特地檢查。
所有情況都該用 v7 嗎? 不一定。資料庫鍵與任何依時間排序的內容用 v7。若建立時間應保持隱藏,就用 v4。
可以把 UUID 當密碼用嗎? 不行。它是識別碼。凡是必須保密的內容,請使用密碼產生器。
工具會把 ID 傳送到別處嗎? 不會。ID 是在你的瀏覽器中產生並顯示的,不會傳送到伺服器。
借助 AI 協助,由英文原文翻譯而成。
留言
還沒有留言,搶先留言吧。


