首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应该使用SecureRandom作为单例,还是应该在每次生成随机数时创建一个新对象?

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

Stack Overflow用户
提问于 2020-02-20 08:24:38
回答 1查看 609关注 0票数 1

我使用SecureRandom生成随机数。

如果SecureRandom对象是单个的,或者每次生成随机数时都会创建一个新的对象,那么对生成的下一个数的可预测性有什么区别吗?

辛格尔顿:

代码语言:javascript
复制
public RequestIdGenerator {
    private static SecureRandom secureRandom = new SecureRandom();

    public static int generateRequestId() {
        secureRandom.nextInt(100_000_000);
    }
}

每次生成随机数时都会出现新的对象:

代码语言:javascript
复制
public RequestIdGenerator {

    public static int generateRequestId() {
        new SecureRandom().nextInt(100_000_000);
    }
}

这个问题是在阅读了关于“线性同生元的可预测性”( 这个答案 )的文章后提出的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-27 07:52:06

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

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

如果你用光了熵,SecureRandom的创建就会在syscall中被阻塞.等着..。为了..。更多的熵将被收获。

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

它不应对可预见性产生任何影响。如果将种子SecureRandom视为黑匣子,则不可能预测下一个数字,除非您知道种子和生成器以前的历史记录。

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

这个问题是在读到关于.“线性同余发生器的可预测性”。

LCG根本不安全。不能将其用于SecureRandom实现。

javadoc包含对任何SecureRandom实现的需求的引用。如果你有实际问题,请阅读参考资料。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60315622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档