SecureRandom 随机数生成器
SecureRandom 随机种子
在生成随机数的时候,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。
我们知道,Random类中实现的随机算法是伪随机,也就是有规则的随机。相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,生成的随机数字完全相同。
SecureRandom和Random类似,如果种子一样则产生的随机数也一样。因为种子确定,随机数算法也确定,因此输出是确定的。如下代码所示,两个随机数生成器secureRandom1和secureRandom2,竟然生成了相同的随机数序列。
public class Test
{
public static void main(String[] args)
{
SecureRandom secureRandom1 = new SecureRandom("abcd".getBytes());
SecureRandom secureRandom2 = new SecureRandom("abcd".getBytes());
for (int i = 0; i < 10; i++)
{
System.out.print(secureRandom1.nextInt(100) + ",");
}
System.out.println();
for (int i = 0; i < 10; i++)
{
System.out.print(secureRandom2.nextInt(100) + ",");
}
System.out.println();
// 结果为:
// 34,44,40,30,1,73,49,4,37,56,
// 34,44,40,30,1,73,49,4,37,56,
}
}
SecureRandom 实现原理
SecureRandom类收集了一些随机事件,比如鼠标点击,键盘点击等等,SecureRandom 使用这些随机事件作为种子。这意味着,种子是不可预测的,而不像Random默认使用系统当前时间的毫秒数作为种子。如下面代码所示,两个随机数生成器secureRandom1和secureRandom2,生成了不相同的随机数序列。
public class Test
{
public static void main(String[] args)
{
SecureRandom secureRandom1 = new SecureRandom();
SecureRandom secureRandom2 = new SecureRandom();
for (int i = 0; i < 10; i++)
{
System.out.print(secureRandom1.nextInt(100) + ",");
}
System.out.println();
for (int i = 0; i < 10; i++)
{
System.out.print(secureRandom2.nextInt(100) + ",");
}
System.out.println();
// 随机结果为:
// 74,85,26,72,71,27,84,36,25,41,
// 67,4,54,35,96,47,49,28,40,85,
}
}