gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:47:55 25 4
gpt4 key购买 nike

我正在尝试使用 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 类的线程安全说明:

Instances of java.util.Random are threadsafe. However, the concurrent use of the same java.util.Random instance across threads may encounter contention and consequent poor performance. Consider instead using ThreadLocalRandom in multithreaded designs.

请注意,ThreadLocalRandom 不是密码安全的,因此对您来说不是一个好的选择。一般来说,您应该尽量避免使用 static 类字段,尤其是当实例是有状态时。

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

关于Java SecureRandom 声明应该是特定于静态类的,也可以是特定于实例的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68286343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com