我使用SecureRandom.urlsafe_base64(8)是为了在我的系统中创建URL安全的唯一ID。我想知道如何计算冲突的概率?我将大约10.000个id插入到数组中,我想避免检查其中一个键是否已经在数组中,但我也想确保这些键不重复?概率是多少?
SecureRandom.urlsafe_base64(8)
hjqgdpho1#
该概率有一个很好的近似值(与birthday problem有关)。如果存在k潜在值,并且对n进行采样,则碰撞的概率为:
k
n
k! / (k^n * (k - n)!)
base64方法返回一个以64为基数的字符串,该字符串由输入的随机字节数而不是随机数字数组成,8个随机字节的结果是k = 256^8,大约是1.8446744e+19,我们将生成10,000个这样的字符串,即n = 10,000,它给出的概率是2.710498492319857e-12,这是非常低的。
k = 256^8
1.8446744e+19
n = 10,000
2.710498492319857e-12
svdrlsy42#
你不能通过计算概率来确定某件事,你只知道它发生的可能性有多大。为了保护自己,只需在数据库列中添加一个唯一的索引,这样就可以确保数据库中不会存储重复的数据。当这种不太可能发生的事件发生时,插入操作将引发ActiveRecord::InvalidStatement错误(请参阅@AndrewPilser的答案)。
ActiveRecord::InvalidStatement
bvhaajcl3#
稍微调整一下安德鲁的回答,我相信碰撞概率的公式是:设k为电位值,n为样本数,则方程为:
根据birthday problem wiki,给出不存在冲突的概率。你可以通过尝试几个不同的n值来进行合理性检查。更多的样本自然会给予更高的冲突概率。
3条答案
按热度按时间hjqgdpho1#
该概率有一个很好的近似值(与birthday problem有关)。如果存在
k
潜在值,并且对n
进行采样,则碰撞的概率为:base64方法返回一个以64为基数的字符串,该字符串由输入的随机字节数而不是随机数字数组成,8个随机字节的结果是
k = 256^8
,大约是1.8446744e+19
,我们将生成10,000个这样的字符串,即n = 10,000
,它给出的概率是2.710498492319857e-12
,这是非常低的。svdrlsy42#
你不能通过计算概率来确定某件事,你只知道它发生的可能性有多大。
为了保护自己,只需在数据库列中添加一个唯一的索引,这样就可以确保数据库中不会存储重复的数据。当这种不太可能发生的事件发生时,插入操作将引发
ActiveRecord::InvalidStatement
错误(请参阅@AndrewPilser的答案)。bvhaajcl3#
稍微调整一下安德鲁的回答,我相信碰撞概率的公式是:
设
k
为电位值,n
为样本数,则方程为:根据birthday problem wiki,给出不存在冲突的概率。
你可以通过尝试几个不同的
n
值来进行合理性检查。更多的样本自然会给予更高的冲突概率。