Java 从SecureRandom获取确定性值?

Java 从SecureRandom获取确定性值?,java,random,Java,Random,出于基准测试的目的,我希望有一个SecureRandom生成确定性输出。这是否可以通过使用种子(或者指定算法)实现 对我来说,即使指定了种子,上面的程序也会产生不同的值。最简单的方法可能是让大部分代码只依赖于随机的,并注入实例(例如,通过将其传递到构造函数)。这样,出于测试目的,您可以使用固定种子传入一个简单的Random,但对于需要安全性的实际运行,您可以传入一个SecureRandom的实例,所有内容都在以下部分中进行了明确说明: 许多SecureRandom实现都是伪随机的 数字生成器(P

出于基准测试的目的,我希望有一个SecureRandom生成确定性输出。这是否可以通过使用种子(或者指定算法)实现


对我来说,即使指定了种子,上面的程序也会产生不同的值。

最简单的方法可能是让大部分代码只依赖于
随机的
,并注入实例(例如,通过将其传递到构造函数)。这样,出于测试目的,您可以使用固定种子传入一个简单的
Random
,但对于需要安全性的实际运行,您可以传入一个
SecureRandom

的实例,所有内容都在以下部分中进行了明确说明:

许多SecureRandom实现都是伪随机的 数字生成器(PRNG),这意味着它们使用确定性 从真随机种子生成伪随机序列的算法。 其他实现可能会产生真正的随机数,还有一些 可以同时使用这两种技术

如果您问起实现,在Linux中它使用
/dev/uradom
,因此结果是不可预测的。但是,您可以强制
SecureRandom
使用另一种算法:

SecureRandom rnd = SecureRandom.getInstance("SHA1PRNG");

但在许多情况下,最合理的想法是使用一些OOP模式(例如),以覆盖默认的种子传递算法名称,如下所示

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());
    }
}
输出


根据javadoc()的说法,它是不确定的
setSeed
仅更改其内部状态,但它仍然是非确定性的。它必须是
SecureRandom
?它是否可以是其他类型的
随机
(例如,
随机
本身)?否。程序到
界面
。在代码中使用
Random
。我最终使用了
Random
界面,但了解这一点也很有用。
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());
    }
}
-207444710
-1693504542