UUID 產生工具

生成與驗證 UUID(v1、v4、v5、v7),支援批次處理與多種格式化選項,並提供多語言程式碼範例。

UUID 產生器

格式選項

UUID 驗證器

使用說明

UUID 是 128 位元識別符,標準表示法為包含連字號的 36 個字元。
UUID v1:基於時間戳記與網卡資訊,具時間順序性,但可能洩露時間/位置資訊。
UUID v4:基於隨機數,最常用,具有良好的唯一性與隱私權保護。
UUID v7:基於 Unix 毫秒時間戳記 + 隨機數,天然可排序,同時避免 v1 的隱私權問題。
UUID v5:基於命名空間 UUID 與名稱,透過 SHA-1 計算;相同輸入會產生確定的結果。
標準格式:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(共 36 個字元)。

功能特色

  • 支援 UUID v1、v4、v5、v7
  • 支援自訂數量的批次產生
  • 彈性格式化:大寫、去連字號、加括號
  • 內建驗證器與版本辨識
  • 完整的國際化與多主題支援

什麼是 UUID

UUID 是 128 位元識別符,標準表示法為包含連字號的 36 個字元。

UUID v1:基於時間戳記與網卡資訊,具時間順序性,但可能洩露時間/位置資訊。

UUID v4:基於隨機數,最常用,具有良好的唯一性與隱私權保護。

UUID v7:基於 Unix 毫秒時間戳記 + 隨機數,天然可排序,同時避免 v1 的隱私權問題。

UUID v5:基於命名空間 UUID 與名稱,透過 SHA-1 計算;相同輸入會產生確定的結果。

UUID 快速範例

標準格式:
550e8400-e29b-41d4-a716-446655440000
大寫格式:
550E8400-E29B-41D4-A716-446655440000
無連字號:
550e8400e29b41d4a716446655440000
帶大括號:
{550e8400-e29b-41d4-a716-446655440000}

UUID 常見用途

  • 資料庫記錄或資源的唯一識別碼
  • 日誌與事件追蹤的 Trace ID
  • 難以猜測的公開識別碼
  • 跨系統介面中的統一識別碼

UUID 常見問題與陷阱

  • v1 與隱私權:v1 可能洩露時間/位置資訊,重視隱私權時建議使用 v4。
  • 大小寫是否等價:比對時不區分大小寫
  • 連字號僅為呈現用途;除非受限,一般建議保留。
  • 大括號格式在某些環境中可接受(如 Windows 註冊表)
  • v5 具有確定性(相同命名空間 + 名稱 => 相同 UUID)。適用於冪等情境;不適合需要不可預測性的場景。

如何在程式語言中使用 UUID

JavaScript
產生
// UUID v4 (simple)
function uuidv4(){
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
    const r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8);
    return v.toString(16);
  });
}
const id = uuidv4();
UUID v7(Unix 時間 + 隨機)
// UUID v7 (Unix ms + randomness)
function uuidv7(){
  const cryptoObj = (globalThis.crypto || globalThis.msCrypto);
  const rb = n => { const a = new Uint8Array(n); cryptoObj?.getRandomValues ? cryptoObj.getRandomValues(a) : a.forEach((_,i)=>a[i]=Math.random()*256|0); return a; };
  const hex = b => Array.from(b).map(x=>x.toString(16).padStart(2,'0')).join('');
  const ts = BigInt(Date.now()).toString(16).padStart(12,'0');
  const ver = rb(2); ver[0] = (ver[0] & 0x0f) | 0x70;    // set version 7
  const vrn = rb(2); vrn[0] = (vrn[0] & 0x3f) | 0x80;    // RFC4122 variant
  const tail = rb(6);
  return `${ts.slice(0,8)}-${ts.slice(8,12)}-${hex(ver)}-${hex(vrn)}-${hex(tail)}`;
}
const id7 = uuidv7();
驗證
const re=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-57][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
re.test(id); // true/false
PHP
產生
<?php
// v4 using random_bytes
function uuidv4(){
  $data = random_bytes(16);
  $data[6] = chr((ord($data[6]) & 0x0f) | 0x40);
  $data[8] = chr((ord($data[8]) & 0x3f) | 0x80);
  return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
$id = uuidv4();
UUID v7(Unix 時間 + 隨機)
<?php
// composer require ramsey/uuid:^4.7
use Ramsey\Uuid\Uuid;

$uuid7 = Uuid::uuid7();
驗證
<?php
$re = '/^[0-9a-f]{8}-[0-9a-f]{4}-[1-57][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i';
preg_match($re, $id) === 1; // true/false
Python
產生
import uuid
# v4
uid = uuid.uuid4()
# v1
uid1 = uuid.uuid1()
UUID v7(Unix 時間 + 隨機)
# pip install uuid6
from uuid6 import uuid7

uid7 = uuid7()
驗證
import re
re_uuid = re.compile(r'^[0-9a-f]{8}-[0-9a-f]{4}-[1-57][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', re.I)
bool(re_uuid.match(str(uid)))
Go
產生
// go get github.com/google/uuid
import "github.com/google/uuid"

id := uuid.New()     // v4
id1 := uuid.NewUUID() // v1 (may return error)
UUID v7(Unix 時間 + 隨機)
// go get github.com/gofrs/uuid/v5
import (
  uuid "github.com/gofrs/uuid/v5"
)

id7, err := uuid.NewV7()
驗證
import "github.com/google/uuid"
_, err := uuid.Parse(id.String()) // err == nil means valid
Rust
產生
// Cargo.toml: uuid = { version = "1", features = ["v4", "v1"] }
use uuid::Uuid;

let v4 = Uuid::new_v4();
// v1 requires a context/ts, often via external crate; shown for completeness
UUID v7(Unix 時間 + 隨機)
// Cargo.toml: uuid = { version = "1", features = ["v7"] }
use uuid::Uuid;

let v7 = Uuid::now_v7();
驗證
use uuid::Uuid;
let ok = Uuid::parse_str(v4.to_string().as_str()).is_ok();
Java
產生
import java.util.UUID;

UUID id = UUID.randomUUID(); // v4
UUID v7(Unix 時間 + 隨機)
// Maven: com.github.f4b6a3:uuid-creator
import com.github.f4b6a3.uuid.UuidCreator;

UUID v7 = UuidCreator.getTimeOrderedEpoch(); // UUIDv7
驗證
import java.util.UUID;

try { UUID.fromString(id.toString()); /* valid */ } catch (IllegalArgumentException ex) { /* invalid */ }