Java SecureRandom 声明应该是特定于静态类的,也可以是特定于实例的

2024-04-13

我正在尝试使用SecureRandom在我的java项目中生成随机数。但我对如何保存我的对象有点困惑SecureRandom。它应该是一个static班级成员。我不打算从外面打电话。以下是我当前的实现:

Class MyClass {

    private static final SecureRandom secureRandom = new SecureRandom();

    private long calculate(int noOfRetry){
        final long value = someValueCalculationWith-noOfRetry;
        final float randomNo = secureRandom().nextFloat() + 1;
        return (long) (value*randomNo);
    }
}

这是在 java 中使用 SecureRandom 的正确方法吗?


不,别成功static。如果您愿意,可以将其设为实例字段,但将其设为类字段并不是最佳选择。例如。请参阅关于线程安全的注释Random它派生自的类:

实例java.util.Random是线程安全的。然而,同时使用相同的java.util.Random跨线程的实例可能会遇到争用并导致性能不佳。考虑改为使用ThreadLocalRandom在多线程设计中。

但请注意,ThreadLocalRandom is not加密安全,因此对您来说不是一个好的选择。一般来说,您应该尝试并避免使用static类字段,尤其当实例是stateful.

如果您只需要一个或几个不处于紧密循环中的方法中的随机实例,那么将其设为本地实例就完全没问题(只需使用var rng = new SecureRandom()换句话说,或者甚至只是new SecureRandom()如果你有a single需要它的方法调用)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java SecureRandom 声明应该是特定于静态类的,也可以是特定于实例的 的相关文章

随机推荐