【问题标题】:Random number generation guaranteeing uniqueness over time随机数生成保证随时间的唯一性
【发布时间】:2017-11-21 10:38:04
【问题描述】:

我创建了一个从 0 上升到 9999 的计数器,直到它再次重置。我将此计数器的输出用作创建唯一条目的值。但是,每次重新启动应用程序时,应用程序都需要找到其最后创建的编号。因此,我正在寻找一种避免任何类型的对象存储并且仅依赖于随机数生成的方法。

类似:

int randomTimeBasedGenerator() {
    Random r = new Random(System.currentTimeMillis())
    int num = r.nextInt() % 9999
    return num
}

但是我有什么保证这种方法会生成唯一的数字?如果不是,它还能保持独特性多久?对于这种情况,我可以查看任何研究论文吗?

对于我的情况,随机数生成将是一个优雅的解决方案,如果我至少可以保证它不会在几周或几个月内重复。但是,如果不存在这样的保证,随机数生成在我的情况下将毫无用处。

【问题讨论】:

  • 获得一个递增的整数序列重要吗?如果没有,您可以使用 UUID 来生成有保证的唯一值(不过,它们是字符串,或者,如果您愿意,也可以是非常大的整数)。
  • 谢谢@Thilo,即使重新启动/重新部署应用程序,UUID 是否也能保证唯一性?我可以只提取最后 4 个值并仍然保持唯一性还是会丢失?
  • 是的,它们是独一无二的,没有任何外部协调。 “最后 4 个值”是什么意思?如果您问是否可以将 UUID 缩短为几位数字,那么:不,这会导致冲突。
  • 阅读生日悖论:en.wikipedia.org/wiki/Birthday_attack 使用 65536 个不同的随机数(您的随机数甚至更少),您只需要 300 个数字就能以 50% 的概率获得重复。
  • 您真的需要数字以随机方式运行吗?不断增加的值也将是唯一的,它必须看起来随机吗?

标签: random unique uniqueidentifier unique-index


【解决方案1】:

您无法保证随机数生成器的返回值保持唯一。随机数生成器生成唯一的数字序列,而不是唯一的数字。随机数迟早会总是重复自己。

正如@Thilo 所建议的,UUID 是唯一的数字。但在您的情况下,一个更好的方法可能是设置一个轻量级数据库(sqlite 可以)并将记录添加到具有增量 id 的表中。如果不将值存储在某处,就不可能跟踪进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多