1

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);
    }
}

这个问题是在阅读了与“线性同余生成器的可预测性”相关的答案后出现的。

4

1 回答 1

3

SecureRandom 应该用作单例还是应该在每次生成随机数时创建一个新对象?

您不应该创建很多SecureRandom实例。它很昂贵,并且容易耗尽系统的熵源(随机性)。

如果熵用完了,则SecureRandom创建可能会阻塞在系统调用中……等待……等待……收获更多熵。

它在可预测性方面有什么不同吗?

它不应该对可预测性产生任何影响。如果您将种子 视为黑盒,则除非您知道种子和生成器的先前历史,否则SecureRandom应该无法预测下一个数字。

需要注意的是,安全随机数生成器的有缺陷的实现实际上可能并不安全。(但另一方面是你用来生成种子的熵可能不像你想象的那么随机......要么。)

这个问题是在阅读了关于......“线性同余生成器的可预测性”之后出现的。

LCG 从根本上说是不安全的。您不能将一个用于SecureRandom实现。

javadocSecureRandom包括对任何实现要求的引用。如果您有实际问题,请阅读参考资料。

于 2020-03-27T07:52:06.023 回答