从SecureRandom获取确定性值?

jay*_*ynp 6 java random

出于基准测试的目的,我想让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)

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

Jon*_*eet 8

执行此操作的最简单方法可能是使大多数代码仅依赖于Random注入实例(例如,将其传递给构造函数).这样,出于测试目的,您可以Random使用固定种子传递一个简单的- 但对于需要安全性的实际运行,您可以传入一个实例SecureRandom.


sol*_*4me 5

为了覆盖默认种子,请像这样传递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)