关于java:SecureRandom每次都能保证不同的值吗?

Does SecureRandom guarantee distinct values each time?

我需要生成加密安全、随机和唯一的字符串,每个字符串实际上都将用作访问令牌。为此,我计划使用Java的EDCOX1×0类。但是,我不确定SecureRandom是否保证了唯一性。换句话说,SecureRandom是否在每次生成时都产生不同的值?

似乎创建具有seed值(即new SecureRandom(byte[] seed)值)的实例是可行的。但是,我不确定。此外,这个答案说明种子既不安全也不可携带。种子价值服务器我的目的吗?

如果你有SecureRandom以外的建议,我也想听听。


不,SecureRandom实例不能保证唯一的结果。如果它确实保证了这一点,它就不会是完全随机的,正如你所知道的那样,你无法得到你已经收到的结果。

设置种子值并不能改善这种情况。它也不会使情况变得更糟,因为您传递的种子是添加(补充)由SecureRandom实现内部生成的种子。

如果要保证唯一随机数,则需要保留所有以前生成的数字,然后检查生成新数字的时间(如果已返回)。如果有,您需要生成一个新号码(并重复检查)。

但是,如果您生成的数字很大,则生成非唯一数字的机会将变得非常小。尝试生成256位或更多(32字节)的数字。这也是UUID用来生成"唯一"数字的机制。这些也不能保证是唯一的,但你必须等待很长的时间(平均)才能得到一个副本。