Ruby中SecureRandom.urlsafe_base64(8)的冲突概率?

yzckvree  于 2022-11-04  发布在  Ruby
关注(0)|答案(3)|浏览(119)

我使用SecureRandom.urlsafe_base64(8)是为了在我的系统中创建URL安全的唯一ID。
我想知道如何计算冲突的概率?我将大约10.000个id插入到数组中,我想避免检查其中一个键是否已经在数组中,但我也想确保这些键不重复?概率是多少?

hjqgdpho

hjqgdpho1#

该概率有一个很好的近似值(与birthday problem有关)。如果存在k潜在值,并且对n进行采样,则碰撞的概率为:

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

base64方法返回一个以64为基数的字符串,该字符串由输入的随机字节数而不是随机数字数组成,8个随机字节的结果是k = 256^8,大约是1.8446744e+19,我们将生成10,000个这样的字符串,即n = 10,000,它给出的概率是2.710498492319857e-12,这是非常低的。

svdrlsy4

svdrlsy42#

你不能通过计算概率来确定某件事,你只知道它发生的可能性有多大。
为了保护自己,只需在数据库列中添加一个唯一的索引,这样就可以确保数据库中不会存储重复的数据。当这种不太可能发生的事件发生时,插入操作将引发ActiveRecord::InvalidStatement错误(请参阅@AndrewPilser的答案)。

bvhaajcl

bvhaajcl3#

稍微调整一下安德鲁的回答,我相信碰撞概率的公式是:
k为电位值,n为样本数,则方程为:

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

根据birthday problem wiki,给出不存在冲突的概率。
你可以通过尝试几个不同的n值来进行合理性检查。更多的样本自然会给予更高的冲突概率。

相关问题