【发布时间】:2020-02-20 08:24:38
【问题描述】:
我正在使用SecureRandom 来生成随机数。
如果SecureRandom 对象是单例对象或每次生成随机数时都创建一个新对象,这对生成的下一个数字的可预测性有什么影响吗?
单例:
public RequestIdGenerator {
private static SecureRandom secureRandom = new SecureRandom();
public static int generateRequestId() {
secureRandom.nextInt(100_000_000);
}
}
对比
每次生成随机数的新对象:
public RequestIdGenerator {
public static int generateRequestId() {
new SecureRandom().nextInt(100_000_000);
}
}
这个问题是在阅读了与“线性同余生成器的可预测性”相关的 this answer 之后提出的。
【问题讨论】:
-
为什么投反对票?
-
它不应该有所作为(尽管
SecureRandom的大部分内容是特定于平台的),但这并不重要,因为第一种方式是正确的方式,而第二种方式是非常错误的方式。 -
@Kayaman 如果它不应该有所作为,为什么第二个大错特错?
-
@FedericoklezCulloca 因为
SecureRandom是一个不必要地创建的昂贵对象,所以虽然它不应该影响可预测性(尽管它可能会耗尽熵,但不确定,guess not)它仍然是一个明显的使用长寿对象的错误方法。
标签: java random secure-random