`

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

阅读更多
 详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp84

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,因为它是线性可预测的。记得有个新闻说的是一个XX网站,为了说明其公平,公开的它的源代码,结果因为随机数可预测漏洞被攻击了。所以在安全性要求比较高的场合,应当使用SecureRandom。
参考: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的方法(注意,强度不高,有可能会重复):
[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. new UUID(ThreadLocalRandom.current().nextLong(), ThreadLocalRandom.current().nextLong());  
在一个网站上看到的,忘记出处了。


随机生成产生随机数的函数?
是否可以利用一个随机数生成器来生成一系列的随机代码,然后作为一个新的随机数生成器?貌似强度是传递的,似乎没意义。
转自:http://blog.csdn.net/hengyunabc/article/details/9913143
分享到:
评论

相关推荐

    0-100随机数生成器

    总的来说,"0-100随机数生成器"是一个使用JAVA编写的、可以在无JAVA环境的机器上运行的工具,它利用了JAVA的`Random`类或其他随机数生成机制,可能包含用户友好的界面和/或定制的随机数算法。对于那些需要在多种环境...

    java生成随机数

    在Java编程语言中,生成随机数是一项常见的任务,可以用于各种场景,比如模拟...在实际应用中,根据需求选择合适的随机数生成器,如`Random`、`ThreadLocalRandom`或`SecureRandom`,可以满足不同的性能和安全性要求。

    Java随机数.pdf

    首先,`java.util.Random`是Java 1.0就引入的基础随机数生成器。这个类可以生成各种类型的随机数值,包括整数、浮点数和双精度数。然而,`Random`类在多线程环境下使用时可能存在性能问题,因为它的`nextGaussian()`...

    java 随机数.docx

    理解如何有效地使用这些随机数生成器是 Java 程序员必备的技能之一。 在多线程环境中,ThreadLocalRandom 类比 Random 类更高效,因为它避免了线程同步的开销。每个线程都有自己的独立副本,这意味着每个线程可以...

    【转】利用系统时间可预测破解java随机数

    标题中的“利用系统时间可预测破解java随机数”揭示了一个重要的信息安全问题,即Java的随机数生成器在某些情况下可能不那么随机,可以被有心人利用系统时间预测。这通常发生在程序依赖于系统时间来生成随机数序列时...

    Random_Number_Generator:简单的随机数生成器

    在IT领域,随机数生成器(Random Number Generator,RNG)是编程中不可或缺的一部分,尤其在游戏开发、模拟计算、加密算法以及统计分析等场景中。这个名为"Random_Number_Generator"的项目,正如其标题所示,是一个...

    随机生成11位数字

    - **安全性**:虽然`Math.random()`生成的随机数足够用于大多数情况,但对于安全性要求极高的场景(如密码生成),可能需要使用更安全的随机数生成器,如`SecureRandom`类。 #### 6. 扩展与应用 - **扩展**:如果...

    生成加密随机数.rar

    加密随机数生成器(CSPRNG, Cryptographically Secure Pseudo-Random Number Generator)是用于生成这些数字的工具,它们必须具备不可预测性、均匀分布以及抗攻击的特性。以下是对生成加密随机数的一些详细解释: 1...

    浅谈Java中的几种随机数

    总的来说,Java提供了三种不同的随机数生成器,分别适用于不同的场景:`Random`适合通用的随机数生成,`ThreadLocalRandom`适用于并发环境,而`SecureRandom`则用于安全性要求较高的应用。理解和灵活运用这些类,...

    JAVA 16位ID生成工具类含16位不重复的随机数数字+大小写

    该类使用了ThreadLocal变量来存储随机数生成器,从而提高了随机数生成的性能。 知识点5:Java中的随机数生成算法 Java中有多种随机数生成算法,包括线性同余算法、加密强随机数生成算法等。SecureRandom类使用了...

    android源码随机数

    在Java语言中,`java.util.Random` 是最常用的随机数生成器。Android作为基于Java的平台,自然也支持这个类。`Random` 类提供了生成各种类型随机数的方法,如整数、长整数、浮点数等。例如,生成一个0到100之间的...

    java语言生成唯一ID的方法

    - **成员变量**:包括主机地址、随机数生成器、消息摘要对象、唯一时间生成器等。 - **静态成员**:定义了一个字符数组`digits`用于存储十六进制数字,并使用`HashMap`来存储每个字符对应的整数值。 - **构造函数**...

    Java随机数算法原理与实现方法实例详解.docx

    除了基本的随机数生成,Java还允许开发者自定义随机数生成器。例如,通过继承`java.util.Random`类并重写其`next()`方法,可以实现特定的随机数分布,如均匀分布、正态分布等。 在实际应用中,随机数算法广泛应用于...

    Java获取随机数的3种方法和总结

    Math.random()是Java中最基础的随机数生成方法,它返回一个0.0到1.0之间的浮点数(不包括1.0),精确到小数点后15位。如果你需要生成一个指定范围内的整数,你可以将这个浮点数乘以范围大小(最大值-最小值+1),...

    java伪随机数

    在实际应用中,对于某些应用而言,需要使用更高精度的随机数生成器,比如java.security.SecureRandom类,它基于更复杂的算法来保证随机数的质量,通常用于安全敏感的应用中。 6. 性能问题:对于需要大量生成随机数...

    浅谈java随机数的陷阱

    另外,如果需要生成高强度的随机数,可以使用SecureRandom类,该类提供了强随机数生成器,可以产生高强度的随机数。SecureRandom的种子是通过收集计算机的各种信息来生成的,例如键盘输入时间、内存使用状态、硬盘...

    STRNG:随机数生成器的统计测试

    本篇文章将深入探讨“STRNG:随机数生成器的统计测试”这一主题,重点关注Java中的随机数生成和统计测试方法。 首先,我们来了解Java中的`Random`类。`Random`是Java标准库中的一个核心类,它提供了一系列的方法来...

    Random_Numbers_Android-master_randomnumbers_random_androidstudio

    开发者可能会使用`onCreate()`方法初始化随机数生成器,然后在UI上展示结果,或者响应用户的点击事件来动态生成随机数。 项目的结构,即"Random_Numbers_Android-master",表明这是一个Git仓库的主分支,通常包含`....

    java随机生成数字 验证码

    - `secure`:布尔值,决定是否使用安全随机数生成器。 #### 3. 随机数生成 随机数生成是通过`getFloat()`方法实现的,该方法会根据`secure`变量的值选择使用`SecureRandom`或`Random`对象。如果`secure`为真,则...

    Java获取随机字符串

    在这段代码中,首先检查是否需要使用安全级别的随机数生成器。如果是,则尝试获取`SecureRandom`实例;如果不是,则使用`java.util.Random`。接下来,在`generaterandom()`方法中实现了生成随机数的功能,可以根据...

Global site tag (gtag.js) - Google Analytics