开发者社区> 横云断岭> 正文

Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom

简介: 文中的 Random即:java.util.Random, ThreadLocalRandom 即:java.util.concurrent.ThreadLocalRandom SecureRandom即:java.security.SecureRandomQ:Random是不是线程安全的? A:Random是线程安全的,但是多线程下可能性能比较低。
+关注继续查看

文中的

Random即:java.util.Random,
ThreadLocalRandom 即:java.util.concurrent.ThreadLocalRandom
SecureRandom即:java.security.SecureRandom


Q:Random是不是线程安全的?
A:Random是线程安全的,但是多线程下可能性能比较低。
参考:
http://docs.oracle.com/javase/7/docs/api/java/util/Random.html
http://stackoverflow.com/questions/5819638/is-random-class-thread-safe

Q:ThreadLocalRandom为什么这么快?
A:其实这个看下源码就知道了。。因为Random用了很多CAS的类,ThreadLocalRandom根本没有用到。

Q:为什么在高强度要求的情况下,不要用Random?

A:特别是在生成验证码的情况下,不要使用Random,因为它是线性可预测的。记得有个新闻说的是一个赌博网站,为了说明其公平,公开的它的源代码,结果因为随机数可预测漏洞被攻击了。所以在安全性要求比较高的场合,应当使用SecureRandom。

update 2014-4-22:  http://news.cnblogs.com/n/206074/

参考:http://www.inbreak.net/archives/349

Q:从理论上来说计算机产生的随机数都是伪随机数,那么如何产生高强度的随机数?
A:产生高强度的随机数,有两个重要的因素:种子和算法。当然算法是可以有很多的,但是如何选择种子是非常关键的因素。如Random,它的种子是System.currentTimeMillis(),所以它的随机数都是可预测的。那么如何得到一个近似随机的种子?这里有一个很别致的思路:收集计算机的各种信息,如键盘输入时间,CPU时钟,内存使用状态,硬盘空闲空间,IO延时,进程数量,线程数量等信息,来得到一个近似随机的种子。这样的话,除了理论上有破解的可能,实际上基本没有被破解的可能。而事实上,现在的高强度的随机数生成器都是这样实现的。
比如Windows下的随机数生成器:
http://blogs.msdn.com/b/michael_howard/archive/2005/01/14/353379.aspx
http://msdn.microsoft.com/en-us/library/aa379942%28VS.85%29.aspx
Linux下的 /dev/random:
http://zh.wikipedia.org/wiki//dev/random
据SecureRandom的Java doc,说到在类unix系统下,有可能是利用 /dev/random,来实现的。


其它的一些有意思的东东:
最快的安全性要求不高的生成UUID的方法(注意,强度不高,有可能会重复):
new UUID(ThreadLocalRandom.current().nextLong(), ThreadLocalRandom.current().nextLong());
在一个网站上看到的,忘记出处了。


随机生成产生随机数的函数?
是否可以利用一个随机数生成器来生成一系列的随机代码,然后作为一个新的随机数生成器?貌似强度是传递的,似乎没意义。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JAVA中生成随机数Random VS ThreadLocalRandom性能比较
JAVA中生成随机数Random VS ThreadLocalRandom性能比较
52 0
Java和c随机数(Random)
一、前言 二、随机数的创建步骤 1.导包 随机数导包: 2.创建对象: 随机数创建对象: 3.数据接收 接受随机数: 三、Java随机数游戏 代码: 演示图: ​ 四、 c语言的猜数字 示例图:​ 代码:
71 0
Java 随机数产生 Random和Math 解决
Java 随机数产生 Random和Math 解决
19 0
【小家java】Java中Random ThreadLocalRandom 设置随机种子获取随机数精讲(上)
【小家java】Java中Random ThreadLocalRandom 设置随机种子获取随机数精讲(上)
132 0
【小家java】Java中Random ThreadLocalRandom 设置随机种子获取随机数精讲(下)
【小家java】Java中Random ThreadLocalRandom 设置随机种子获取随机数精讲(下)
153 0
Java 随机数生成原理与 ThreadLocalRandom 详解
在 JDK7 中,java.util.concurrent 包含了一个相当便利的类随机数生成类 ThreadLocalRandom,当应用程序期望在多个线程或 ForkJoinTasks 中使用随机数时。 对于并发访问,使用 TheadLocalRandom 代替 Math.random() 可以减少竞争,从而获得更好的性能。 使用中只需调用 ThreadLocalRandom.current(), 然后调用它的其中一个方法去获取一个随机数即可。
162 0
Java:通过Random获取伪随机数
Java:通过Random获取伪随机数
39 0
+关注
横云断岭
负责7K+应用,100K+机器的Spring Boot微服务技术落地,关注开发体验,微服务,APM,应用诊断技术。Dubbo/Arthas开源。 github: https://github.com/hengyunabc
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载