Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
文中的
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,ThreadLocalRandom,SecureRandom的更多相关文章
- Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom(转)
文中的 Random即:java.util.Random,ThreadLocalRandom 即:java.util.concurrent.ThreadLocalRandomSecureRandom即 ...
- [转]Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp84 Random即:java.util.Random, ThreadL ...
- Java中产生随机数的两个方法
Java中产生随机数的两个方法 一.利用random方法来生成Java随机数. 在Java语言中生成Java随机数相对来说比较简单,因为有一个现成的方法可以使用.在Math类中,Java语言提供了一个 ...
- 为什么说Java中的随机数都是伪随机数?
什么是伪随机数? 1.伪随机数是看似随机实质是固定的周期性序列,也就是有规则的随机. 2.只要这个随机数是由确定算法生成的,那就是伪随机,只能通过不断算法优化,使你的随机数更接近随机. (随机这 ...
- Java中利用随机数的猜拳游戏
Java中利用随机数的猜拳游戏,实现非常简单,重难点在于随机数的产生. 首先GameJude类是用于判断输赢的一个类: package testGame; public class GameJudge ...
- java中的随机数Random
java中一般有两种随机数,一个是Math中random()方法,一个是Random类. 一.Math.random() : 随即生成0<x<1的小数 实例:如何写,生成随机生成 ...
- java中random的几个方法的使用Math.random()和random().
random java中我们有时候也需要使用使用random来产生随机数,下面我来简单的介绍下java中random的使用方法 第一种:Math.random() public static doub ...
- Java中随机数的产生方式与原理
查阅随机数相关资料,特做整理 首先说一下java中产生随机数的几种方式 在j2se中我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以 ...
- 工具篇-Java中一些utils
下边是整理的一些Java开发的utils,顺便吐槽下新浪博客的编辑器排版跟我写的博客一样 烂,所以改用博客园 一.字符串 1. Java中String与其他类型之间的转换 String与日期对象 pu ...
随机推荐
- js 系统时间对象
alert(new Date()); 年是多少,月,日 var year=new Date(); var m=year.Getfullmonth; alert(m);月份特殊,必须加个数字1 数据类型 ...
- hdu_5676_ztr loves lucky numbers
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5676 在这%一下安神,用了我没见过的黑科技next_permutation,至少我是今天才知道的 #i ...
- 使用Visual C++编程
1.Visual C++的主要组件 Visual C++支持遵循C++11语言标准的C++语句,C++11语言标准是在ISO/IEC 14882:2011文档中定义的.Visual C++还没有实现该 ...
- Nginx运行Laravel的配置
修改nginx.conf.修改前记得备份一下,万一改错了还能还原回去. server { listen 80; server_name localhost; set $root_path '/usr/ ...
- MySQL的数据类型【总结】
1.时间类型 MySQL的DateTime,TimeStamp,Date和Time数据类型. DATETIME类型用在你需要同时包含日期和时间信息的值时.MySQL检索并且以'YYYY-MM-DD H ...
- nm applet disable
http://support.qacafe.com/knowledge-base/how-do-i-prevent-network-manager-from-controlling-an-interf ...
- Android sdk content loader
方法一(关闭后重启): 遇到Eclipse右下角一直显示“Android sdk content loader 0%”的情况时,直接关掉Eclipse,有ADB进程在运行时通过进程管理器结束进程,然后 ...
- 一篇非常适合git入门的文章
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579 ...
- SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3 
项目使用的是tomcat7 ,浏览器是ie11 突然打开浏览器发现不能获取数据了 tomcat conf server.xml 文件 <Connector port="8080&quo ...
- iOS Learning
转载自:http://www.cocoachina.com/ios/20150111/10894.html iOS 学习资料整理 2015-01-11 20:20 编辑: suiling 分类:iOS ...