我使用的是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 除种子外还使用其他一些随机来源?
答案 0 :(得分:2)
javadoc说:
许多SecureRandom实现采用伪随机数生成器(PRNG)的形式,这意味着它们使用确定性算法从真正的随机种子生成伪随机序列。其他实现可以产生真正的随机数,而其他实现可以使用两种技术的组合。
因此,如所记录的那样,依靠安全随机来通过播种来生成确定性值序列将不一定有效。
答案 1 :(得分:1)
JavaDoc说:
使用包含的八个字节重新设置此随机对象
在给定的long seed
中。 给定的种子补充剂,
而不是替换现有的种子。因此,重复调用
保证永远不会减少随机性。