首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

從列表生成唯一校驗碼:隨機採樣與碰撞概率分析

     編輯:程式設計綜合問答

需求理解

給定包含 n 個不同值的列表,需生成一個唯一校驗碼(如驗證碼、Token、序列號)。

簡單可行方案:隨機採樣拼接

  1. 將 n 個值放入數組/列表。
  2. 使用加密級隨機數生成器(如 secrets、SecureRandom、crypto/rand)隨機選取索引。
  3. 按選取順序拼接對應值,形成校驗碼字符串。
  4. 為進一步降低碰撞率,可雙向採樣(頭尾交替)或增加長度。

碰撞概率估算

若字符集大小為 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) 而非純隨機。

隨機採樣簡單易實現,配合長度與查重機制,滿足絕大多數業務唯一性需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved