核心代碼
import java.util.UUID;
public class IdGenerator {
/**
* 生成 32 位無連字符 UUID(標準 UUID 去掉 '-')
* 例:a1b2c3d4e5f67890123456789abcdef0
*/
public static String generateId() {
return UUID.randomUUID().toString().replace("-", "");
}
}
原理解析
UUID.randomUUID():基於加密級強偽隨機數生成器(SecureRandom)生成 版本 4(隨機)UUID,全局唯一概率極高(2^122 機率碰撞)。
toString():標準格式 xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx(36 字符,含 4 個連字符)。
replace("-", ""):移除連字符得 32 位十六進制字符串,便於數據庫主鍵、分佈式 ID、文件名等場景。
擴展:其他常見 ID 生成策略對比
| 策略 | 特點 | 適用場景 | 有序性 | 依賴 |
| UUID (v4) | 無中心、無協調、極低碰撞 | 分佈式主鍵、臨時文件、追蹤 ID | 無序 | JDK 內置 |
| Snowflake (Twitter) | 64bit 長整型、粗略有序、含時間戳 | 高併發分佈式主鍵、MySQL 主鍵優化 | 趨勢遞增 | 自研/庫 |
| NanoId | 短、URL 安全、可自定義字母表 | 短鏈接、邀請碼、前端友好 | 無序 | 第三方庫 |
| 數據庫自增/序列 | 嚴格遞增、強依賴 DB | 單體應用、小規模 | 有序 | DB |
| ULID | 128bit、時間排序、Base32 編碼 | 需時間排序的分佈式 ID | 可排序 | 第三方庫 |
最佳實踐建議
- 數據庫主鍵:優先考慮 Snowflake/ULID(有序利於 B+ 樹索引),或 UUID v7(草案,時間有序)。純隨機 UUID 導致索引分裂、頁面碎片化,寫入效能下降。
- 業務唯一標識(訂單號、流水號):結合 時間戳 + 業務前綴 + 短隨機碼,可讀性強且便於排查。
- 線程安全:
UUID.randomUUID() 內部使用 ThreadLocalRandom/SecureRandom,線程安全,可直接靜態方法調用。
- 性能敏感場景:若極高頻調用(百萬級/秒),可考慮預生成池或改用
ThreadLocalRandom 組合時間戳+計數器自研。
常見誤區
- 誤以為 UUID 絕不重複:理論上有碰撞概率,極高併發核心業務建議落庫前
INSERT ... ON DUPLICATE KEY 兜底。
- 用
new UUID(0,0) 或 nameUUIDFromBytes 產生業務 ID:前者全零無意義,後者基於命名空間+名字確定性生成(v3/v5),非隨機。