出于基准测试的目的,我想让SecureRandom产生确定性输出.这是通过使用种子(或可能是算法规范)来实现的吗?
import java.security.SecureRandom;
class TestSecureRandom {
public static void main(String [] args) {
SecureRandom rnd = new SecureRandom();
rnd.setSeed(1);
System.out.println(rnd.nextInt());
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,即使指定了种子,上述程序也会产生不同的值.
执行此操作的最简单方法可能是使大多数代码仅依赖于Random注入实例(例如,将其传递给构造函数).这样,出于测试目的,您可以Random使用固定种子传递一个简单的- 但对于需要安全性的实际运行,您可以传入一个实例SecureRandom.
为了覆盖默认种子,请像这样传递PRNG算法名称
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
class TestSecureRandom {
public static void main(String [] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
SecureRandom rnd = SecureRandom.getInstance("SHA1PRNG");
rnd.setSeed("foo".getBytes("us-ascii"));
System.out.println(rnd.nextInt());
System.out.println(rnd.nextInt());
}
}
Run Code Online (Sandbox Code Playgroud)
乌普特
-207444710
-1693504542
Run Code Online (Sandbox Code Playgroud)