【问题标题】:Why does SecureRandom.uuid create a unique string? [closed]为什么 SecureRandom.uuid 创建一个唯一的字符串? [关闭]
【发布时间】:2014-02-28 08:57:30
【问题描述】:

为什么SecureRandom.uuid 会创建一个唯一的字符串?

SecureRandom.uuid
# => "35cb4e30-54e1-49f9-b5ce-4134799eb2c0"

SecureRandom.uuid 方法创建的字符串从不重复?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    字符串实际上保证是唯一的。发生碰撞的可能性很小但有限。

    但是在实践中你永远不会看到使用这种机制生成的两个相同的 id,因为概率非常低。

    您可以放心地将对SecureRandom.uuid 的调用视为在需要管理数十亿个数据库实体的代码中生成一个全球唯一的字符串。

    Here is a small table of collision probabilities.

    意见:如果我要选择一个任意限制,您可能开始在整个数据集上看到一个或两个碰撞,我会选择 10**16 左右的现实概率 - 假设您创建在你的系统中每秒有一百万个 id,那么达到这个规模需要 30 年。即便如此,在整个 30 年的项目中看到任何碰撞的概率大约是 100000 分之一。

    【讨论】:

    • 10**16的依据是什么?
    • @sawa:我现在正在检查我的事实,但它很粗糙0.01 * Math.sqrt(2**122) - 平方根很重要,请查看“生日悖论”
    • 感谢您提供信息,但将碰撞概率(这很容易实现)转换为预期的(平均)试验次数,直到发生碰撞并非易事。
    • @sawa:还不错。对于具有 10 ** 16 条记录的数据库,我很乐意引用 1 in 100000 的概率。这与说我希望看到碰撞完全不同。相反,它是预防性的。我已将该部分标记为 opinion 只是为了表明它不是事实。
    • @Neil Slater 我明白了。谢谢!
    猜你喜欢
    • 2017-03-21
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多