我使用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);
}
}这个问题是在阅读了关于“线性同生元的可预测性”( 这个答案 )的文章后提出的。
发布于 2020-03-27 07:52:06
应该使用SecureRandom作为单例,还是应该在每次生成随机数时创建一个新对象?
您不应该创建许多SecureRandom实例。这是昂贵的,并容易耗尽你的系统的熵源(随机性)。
如果你用光了熵,SecureRandom的创建就会在syscall中被阻塞.等着..。为了..。更多的熵将被收获。
在可预见性方面有什么不同吗?
它不应对可预见性产生任何影响。如果将种子SecureRandom视为黑匣子,则不可能预测下一个数字,除非您知道种子和生成器以前的历史记录。
但需要注意的是,安全随机数生成器的有缺陷的实现可能实际上并不安全。(但另一方面,你用来产生种子的熵可能并不像你想象的那样随机.也可以。)
这个问题是在读到关于.“线性同余发生器的可预测性”。
LCG根本不安全。不能将其用于SecureRandom实现。
javadoc包含对任何SecureRandom实现的需求的引用。如果你有实际问题,请阅读参考资料。
https://stackoverflow.com/questions/60315622
复制相似问题