播种java.security.SecureRandom是不必要的?

时间:2012-12-24 10:35:34

标签: java

我使用的是Java 1.7,并且正如下面的代码所示(在Ubuntu中使用Oracle的Java 7编译器编译)播种 java.security.SecureRandom 似乎是不必要的,因为代码会生成两个不同的BigIntegers用于两个伪随机序列的起始值:

import java.security.SecureRandom;
import java.math.BigInteger;

public class SessionIdTest {

    public static void main (String args[]) {
    long seed = System.currentTimeMillis();
        {
            SecureRandom random = new SecureRandom();
            random.setSeed(seed);
            BigInteger a = new BigInteger(130, random);
            System.out.println(a);
        }
        {
            SecureRandom random = new SecureRandom();
            random.setSeed(seed);
            BigInteger a = new BigInteger(130, random);
            System.out.println(a);
        }
    }
}

那么 setSeed 的目的是什么?或 SecureRandom 除种子外还使用其他一些随机来源?

2 个答案:

答案 0 :(得分:2)

javadoc说:

  

许多SecureRandom实现采用伪随机数生成器(PRNG)的形式,这意味着它们使用确定性算法从真正的随机种子生成伪随机序列。其他实现可以产生真正的随机数,而其他实现可以使用两种技术的组合。

因此,如所记录的那样,依靠安全随机来通过播种来生成确定性值序列将不一定有效。

答案 1 :(得分:1)

JavaDoc说:

使用包含的八个字节重新设置此随机对象 在给定的long seed中。 给定的种子补充剂, 而不是替换现有的种子。因此,重复调用 保证永远不会减少随机性。