当前位置:   article > 正文

java securerandom,Java中生成随机数Random、ThreadLocalRandom、SecureRandom

threadlocalrandom.current和securerandom

使用

我们最常用的方法就是下面这样直接用Random。

Random

最简单的生成随机数

Java

1

2

Randomrandom=newRandom();

inta=random.nextInt(5);

这样a的值可能是0~4之间的数字。

我们再细究一下,其实Random是有构造函数的,他的参数可以传一个long类型的值,当使用空的构造的时候,使用的实际上是System.currentTimeMillis()也就是当前时间毫秒数的值,我们把这个叫做种子。

种子是干什么的呢,实际上我们生成的随机数都是伪随机数,而想要使我们生成的随机数强度更高,就需要更好的

Java

1

2

3

4

5

6

Randomrandom=newRandom(1);

inta=random.nextInt(5);

random=newRandom(1);

intb=random.nextInt(5);

random=newRandom(1);

intc=random.nextInt(5);

所以我们一定不能把这个种子写死,用当前时间毫秒数,还是比较好些。另外,使用Random尽量不要重复new对象,其实也没什么意义的。

最后说一点,Random是线程这里的官方文档可以看到,“Instances of java.util.Random are threadsafe.”。但是在

ThreadLocalRandom

这个类是Java7新增的类,给多线程并发生成随机数使用的。为什么ThreadLocalRandom要比Random快呢,这是因为Random在生成随机数的时候使用了CAS,但是ThreadLocalRandom却没有使用。

另外ThreadLocalRandom的实例化比较特别,下面简单举例一下。

Java

1

2

ThreadLocalRandomthreadLocalRandom=ThreadLocalRandom.current();

inta=threadLocalRandom.nextInt(5);

由于是和线程绑定的,所以他也是从当前线程获取的。

SecureRandom

在需要频繁生成随机数,或者安全要求较高的时候,不要使用Random,这个很好理解吧,从我们最开始的介绍中可以知道,Random生成的值其实是可以预测的。

内置两种随机数算法,NativePRNG和SHA1PRNG,看实例化的方法了。通过new来初始化,默认来说会使用NativePRNG算法生成随机数,但是也可以配置-Djava.security参数来修改调用的算法。如果是/dev/[u]random两者之一就是NativePRNG,否则就是SHA1PRNG。

当然还可以通过getInstance来初始化对象,有一个参数的,直接传一个算法名就行,如果不存在算法抛异常;另外有两个参数的,第二个参数还可以指定算法程序包。下面来看下实现代码。

Java

1

2

3

SecureRandomsecureRandom=newSecureRandom();

SecureRandomsecureRandom3=SecureRandom.getInstance("SHA1PRNG");

SecureRandomsecureRandom2=SecureRandom.getInstance("SHA1PRNG","SUN");

当然我们使用这个类去生成随机数的时候,一样只需要生成一个实例每次去生成随机数就好了,也没必要每次都重新生成对象。另外,这个类生成随机数,首次调用性能比较差,如果条件允许最好服务启动后先调用一下nextInt()。

另外,实际上SHA1PRNG的性能将近要比NativePRNG的性能好一倍,synchronized的代码少了一半,所以没有特别重的安全需要,尽量使用SHA1PRNG算法生成随机数。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/413365
推荐阅读
相关标签
  

闽ICP备14008679号