需求理解
給定包含 n 個不同值的列表,需生成一個唯一校驗碼(如驗證碼、Token、序列號)。
簡單可行方案:隨機採樣拼接
- 將 n 個值放入數組/列表。
- 使用加密級隨機數生成器(如
secrets、SecureRandom、crypto/rand)隨機選取索引。
- 按選取順序拼接對應值,形成校驗碼字符串。
- 為進一步降低碰撞率,可雙向採樣(頭尾交替)或增加長度。
碰撞概率估算
若字符集大小為 C,校驗碼長度為 L,則總空間 = C^L。根據生日悖論,生成 k 個校驗碼後碰撞概率 ≈ 1 - exp(-k²/2C^L)。
- 例:Base62 (C=62),L=16 → 空間 ≈ 4.7e28,生成 10 億個碰撞率仍極低。
- 若業務極度敏感(金融、醫療),建議採用 UUID v4 (122 bit 隨機) 或雪花算法(時間+機器+序列)保證全局唯一。
工程落地建議
- 校驗碼生成與驗證分離,服務端存儲已用碼集合(Redis Set / Bloom Filter)實時去重。
- 避免單純依賴「概率極低」而無重試機制,生成後查重、衝突則重生成。
- 若需可驗證性,採用簽名機制:
HMAC(key, payload) 而非純隨機。
隨機採樣簡單易實現,配合長度與查重機制,滿足絕大多數業務唯一性需求。