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
错误。