Ruby中SecureRandom.urlsafe_base64(8)冲突的可能性?

我正在使用SecureRandom.urlsafe_base64(8)来在我的系统中创建URL安全的唯一ID。

我想知道如何计算碰撞的概率? 我将大约10,000个这些ID插入到数组中,我想避免检查其中一个键是否已经在数组中,但我还想确保不重复? 有什么机会?

这个概率有一个很好的近似值(与生日问题有关 )。 如果有k潜在值且n被采样,则碰撞的概率为:

 k! / (k^n * (k - n)!) 

base64方法返回一个base 64字符串,该字符串是根据输入的随机字节数构建的,而不是随机数字的数目。 八个随机字节给出k = 256^8 ,大约1.8446744e+19 。 你正在生成10,000个这样的字符串,所以n = 10,000 ,这给了我们一个非常低的概率2.710498492319857e-12

你没有通过计算确定概率,你只知道它可能发生的可能性。

为了保护自己,只需向数据库列添加唯一索引即可。 这可确保您无法在数据库中存储重复项。 当发生这种非常不可能的事件(请参阅@ AndrewPilser的答案)时,插入将引发ActiveRecord::InvalidStatement错误。