Random 随机数生成保证随时间变化的唯一性

Random 随机数生成保证随时间变化的唯一性,random,unique,uniqueidentifier,unique-index,Random,Unique,Uniqueidentifier,Unique Index,我创建了一个计数器,从0上升到9999,直到它再次重置。我使用这个计数器的输出作为一个值来创建唯一的条目。但是,每次重新启动应用程序时,应用程序都需要找到上次创建的编号。因此,我正在寻找一种方法,它可以避免任何类型的对象存储,并且完全依赖于随机数生成 比如: int randomTimeBasedGenerator() { Random r = new Random(System.currentTimeMillis()) int num = r.nextInt() % 9999

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

比如:

int randomTimeBasedGenerator() {
    Random r = new Random(System.currentTimeMillis())
    int num = r.nextInt() % 9999
    return num
}
但是我有什么保证可以保证这个方法生成唯一的数字呢?如果不是,它会保持多久的独特性?对于这种情况,我有什么研究论文可以查阅吗


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

您不能保证随机数生成器的返回值保持唯一。随机数生成器生成唯一的数字序列,而不是唯一的数字。随机数迟早会重复出现


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

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


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

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