【发布时间】:2014-02-28 08:57:30
【问题描述】:
为什么SecureRandom.uuid 会创建一个唯一的字符串?
SecureRandom.uuid
# => "35cb4e30-54e1-49f9-b5ce-4134799eb2c0"
SecureRandom.uuid 方法创建的字符串从不重复?
【问题讨论】:
标签: ruby
为什么SecureRandom.uuid 会创建一个唯一的字符串?
SecureRandom.uuid
# => "35cb4e30-54e1-49f9-b5ce-4134799eb2c0"
SecureRandom.uuid 方法创建的字符串从不重复?
【问题讨论】:
标签: ruby
字符串实际上保证是唯一的。发生碰撞的可能性很小但有限。
但是在实践中你永远不会看到使用这种机制生成的两个相同的 id,因为概率非常低。
您可以放心地将对SecureRandom.uuid 的调用视为在需要管理数十亿个数据库实体的代码中生成一个全球唯一的字符串。
Here is a small table of collision probabilities.
意见:如果我要选择一个任意限制,您可能开始在整个数据集上看到一个或两个碰撞,我会选择 10**16 左右的现实概率 - 假设您创建在你的系统中每秒有一百万个 id,那么达到这个规模需要 30 年。即便如此,在整个 30 年的项目中看到任何碰撞的概率大约是 100000 分之一。
【讨论】:
10**16的依据是什么?
0.01 * Math.sqrt(2**122) - 平方根很重要,请查看“生日悖论”