背景
在java开发中广泛使用SecureRandom,产生可靠随机数。但在大量产生随机数的场景下,性能会较低。
引起原因
SecureRandom产生下一个随机数的时候调用nextLong或者nextBytes,最终会调用SecureRandom的nextBytes。而nextBytes是一个同步的方法,在多线程使用时,可能会产生性能瓶颈。
解决方法
使用 -Djava.security.egd=file:/dev/./urandom 加快随机数产生
解决原理
/dev/random在产生大量随机数的时候比/dev/urandom慢,所以,建议在大量使用随机数的时候,将随机数发生器指定为/dev/./urandom。
hotspot需要使用配置项-Djava.security.egd=file:/dev/./urandom才能从urandom读取数据,如果是openjdk已经做了优化,直接从urandom读取数据。
-Djava.security.egd=file:/dev/random
( 这等于默认选项 )
默认算法: NativePRNG
提供程序: SecureRandom.NativePRNG算法来自:SUN
-Djava.security.egd=file:/dev/urandom
默认算法: NativePRNG
提供程序: SecureRandom.NativePRNG算法来自:SUN
-Djava.security.egd=file:/dev/./urandom
默认算法: DRBG
提供者: SecureRandom.DRBG算法来自:SUN
最后,/dev/urandom
即使在使用现代OS时,用作随机源的问题仍然至关重要。
结论:
我建议继续使用-Djava.security.egd=file:/dev/./urandom
Java 11以确保:
1. 无论使用什么平台(DRBG),都可以利用最强大的 SecureRandom 实现
2. 避免使代码意外阻塞(securerandom.source=file:/dev/urandom
)
本站所有资源文章出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。
本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户擦亮眼睛自行鉴别,做一个有主见和判断力的用户。
本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。
联系方式(#替换成@):adminlr###msn.cn