我正在使用SecureRandom.urlsafe_base64(8),以便在我的系统中创建URL安全的唯一ID.
我想知道如何计算碰撞概率?我将大约10.000个这些ID插入到一个数组中,我想避免检查其中一个键是否已经在数组中,但我还想确保不重复?有什么机会?
And*_*ica 14
这个概率有一个很好的近似值(与生日问题有关).如果存在k潜在值并n进行采样,则发生碰撞的概率为:
k! / (k^n * (k - n)!)
Run Code Online (Sandbox Code Playgroud)
所述的base64方法返回从所输入的数字的随机字节,而不是该号码的随机数中的基础64的字符串.八个随机字节给我们k = 256^8,关于1.8446744e+19.你正在生成10,000个这样的字符串,因此n = 10,000,这给了我们一个2.710498492319857e-12非常低的概率.
你不能通过计算确定概率,你只知道它可能发生的可能性.
为了保护自己,只需向数据库列添加唯一索引即可.这可确保您无法在数据库中存储重复项.ActiveRecord::InvalidStatement当这种非常不可能发生的事件(请参阅@ AndrewPilser的回答)时,插入将引发错误.
| 归档时间: |
|
| 查看次数: |
2614 次 |
| 最近记录: |