• [转]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
  • 相关阅读:
    生命
    历史的分岔-中日产业发展史的对照和思考
    挑战自已
    丰台往事已成风,上下求索永不停
    VC6.0实现鼠标光标形状及大小的定制
    RelativeLayout
    16进制颜色代码
    html里的option错误
    Android用户界面设计:布局基础
    Activity详细介绍【官网】
  • 原文地址:https://www.cnblogs.com/grefr/p/5046283.html
Copyright © 2020-2023  润新知