Linux系统下,常见的随机数生成设备:
-
/dev/random
随机性比较好,依赖内核的中断,当中断数量不足,获取随机数的操作会被阻塞。通过安装haveged,可以提升熵值。
JDK的默认选项。 -
/dev/urandom
通过熵池来产生随机数,牺牲一定的随机性,解决性能问题。
启动Java应用时,增加如下选项,指定使用/dev/urandom
作为随机数生成器。-Djava.security.egd=file:/dev/./urandom
文档
-
Java Core Libraries
-
Pseudorandom Number Generators
PRNGs即Pseudorandom Number Generators。 -
Characteristics of PRNGs
-
Generating Pseudorandom Numbers with RandomGenerator Interface
使用RandomGenerator来获取随机数,样例代码,如下:RandomGenerator random1 = RandomGenerator.of("Random"); long value1 = random1.nextLong(); System.out.println(value1);
使用RandomGeneratorFactory来创建随机数生成器,并获取随机数,样例代码,如下:
RandomGeneratorFactory<RandomGenerator> factory2 =RandomGeneratorFactory.of("SecureRandom"); RandomGenerator random2 = factory2.create(); long value2 = random2.nextLong(); System.out.println(value2);
使用Random来获取随机数,样例代码,如下:
Random random = new Random(); int randomNumber = random.nextInt(); System.out.println(randomNumber);
使用SecureRandom来获取随机数,样例代码,如下:
SecureRandom r1 = new SecureRandom(); SecureRandom r2 = SecureRandom.getInstance("NativePRNG"); SecureRandom r3 = SecureRandom.getInstance("DRBG",DrbgParameters.instantiation(128, RESEED_ONLY, null));
RandomGenerator
的几个子类,如下:- RandomGenerator.StreamableGenerator
- RandomGenerator.SplittableGenerator
- RandomGenerator.LeapableGenerator
- RandomGenerator.JumpableGenerator
- RandomGenerator.ArbitrarilyJumpableGenerator
-
Generating Pseudorandom Numbers in Multithreaded Applications
-
Dynamically Creating New Generators
-
Creating Stream of Generators
-
Choosing a PRNG Algorithm
通过使用RandomGenerator.isDeprecated()
或者RandomGeneratorFactory.isDeprecated()
,可以检查随机数生成算法是否被Java官方推荐使用。
当前可用的随机数生成算法:L64X128MixRandom
Xoroshiro128PlusPlus
L32X64StarStarRandom
L32X64MixRandom
Xoshiro256PlusPlus
L64X256MixRandom
MRG32k3a
L128X128MixRandom
L128X256MixRandom
L64X1024MixRandom
L128X1024MixRandom
选择随机数生成器时,平衡如下因素:
- speed,生成随机数的速度
- space,算法运行时占用的空间
- period,随机数的生成周期
参考资料
- Java获取
/dev/urandom
的随机数 - java dev urandom_/dev/random和/dev/urandom的一点备忘
- /dev/urandom和/dev/random的区别
- linux 手动安装移植 haveged,解决随机数初始化慢的问题
- 熵值低于1000,需要启动haveged
- haveged的代码仓库
Additionally, since v5.6, as soon as the CRNG (the Linux cryptographic-strength random number generator) gets ready, /dev/random does not block on reads anymore.
- haveged的官方主页
- 在Java中,可以使用
java.util.Random
类来生成随机数,使用Java生成随机数的示例代码 - 【Java代码审计】失效认证及不安全随机数篇
- Procedual Generation in Minecraft - Structure Generation