Random 类中实现的随机算法是伪随机,也就是有规则的随机
虽然说,可以设置种子,产生不同的随机数;但是如果种子相同,仍然是产生相同的随机数
所以在需要频繁生成随机数,或者安全要求较高的时候,不要使用 Random,因为其生成的值其实是可以预测的。
SecureRandom 类提供加密的强随机数生成器 (RNG)
它的许多实现都是伪随机数生成器 (PRNG) 形式,这意味着它们将使用确定的算法根据实际的随机种子生成伪随机序列
但是,SecureRandom 类收集了一些随机事件,比如鼠标点击,键盘点击等等,SecureRandom 使用这些随机事件作为种子。这意味着,种子是不可预测的,而不像 Random 默认使用系统当前时间的毫秒数作为种子,有规律可寻。
创建 SecureRandom
内置两种随机数算法,NativePRNG 和 SHA1PRNG
new
默认是使用 NativePRNG 算法生成随机数
getInstance
SecureRandom secureRandom1 = SecureRandom.getInstance("SHA1PRNG");
SecureRandom secureRandom2 = SecureRandom.getInstance("SHA1PRNG", "SUN");
使用
和 Random 类似用法
生成随机数
nextInt(int num)
生成 [0, num)
的值
生成随机 byte 数组
nextBytes(byte[] bytes)
获取随机一个 byte 数组,直接改变传入值
SecureRandom random = new SecureRandom();
byte[] test = new byte[20];
random.nextBytes(test);
generateSeed(int numBytes)
这个数组中的数通常可以用来做其他随机生成器的种子
byte seed[] = random.generateSeed(20);
参考
SecureRandom - 码农教程