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

Ruby中SecureRandom.urlsafe_base64(8)的冲突概率?,ruby,uuid,Ruby,Uuid,我正在使用SecureRandom.urlsafe\u base64(8)在我的系统中创建URL安全的唯一ID 我想知道如何计算碰撞的概率?我将这些ID中的大约10.000个插入到一个数组中,我希望避免检查其中一个密钥是否已在数组中,但我还希望确保不会重复?可能性有多大?这个概率有一个很好的近似值(与时间有关)。如果存在k潜在值且对n进行采样,则碰撞概率为: k! / (k^n * (k - n)!) 该方法返回一个基于输入的随机字节数而不是随机数字数构建的64进制字符串。八个随机字节为我们提

我正在使用
SecureRandom.urlsafe\u base64(8)
在我的系统中创建URL安全的唯一ID


我想知道如何计算碰撞的概率?我将这些ID中的大约10.000个插入到一个数组中,我希望避免检查其中一个密钥是否已在数组中,但我还希望确保不会重复?可能性有多大?

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

k! / (k^n * (k - n)!)
该方法返回一个基于输入的随机字节数而不是随机数字数构建的64进制字符串。八个随机字节为我们提供了
k=256^8
,大约
1.8446744e+19
。您正在生成10000个这些字符串,因此
n=10000
,这给了我们一个概率
2.710498492319857e-12
,这非常低。

您无法通过计算概率来确定某件事,您只知道它发生的可能性有多大


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

非常好!如果你需要比“可能”更确定,概率并不重要,你需要验证。