如果您的令牌足够长并且由加密安全的 [伪] 随机数生成器生成,那么您无需验证令牌是否唯一。您不需要在循环中生成令牌。
16 个原始源字节对于这种有效保证来说已经足够长了。当格式化为 URL 安全时,结果会更长。
# Base-64 (url-safe) encoded bytes, 22 characters long
SecureRandom.urlsafe_base64(16)
# Base-36 encoded bytes, naturally url-safe, ~25 characters long
SecureRandom.hex(16).to_i(16).to_s(36)
# Base-16 encoded bytes, naturally url-safe, 32 characters long
SecureRandom.hex(16)
这是因为 16 字节或 128 位令牌不唯一的概率非常小,几乎为零。在生成了大约 2 64 = 18,446,744,073,709,551,616 = 1.845 x 10 19 个令牌之后,只有50% 的机会出现重复。如果您开始每秒生成 10 亿个令牌,大约需要 2 64 /(10 9 *3600*24*365.25) = 600年,直到有 50% 的机会发生任何重复。
但是您每秒不会生成 10 亿个令牌。让我们慷慨一点,假设您每秒生成一个令牌。直到有 50% 的几率发生一次碰撞的时间框架变成了6000 亿年。在那之前很久,这颗行星就会被太阳吞没。