Java中的隨機數生成器:Random,ThreadLocalRandom,SecureRandom

 

Java中的隨機數生成器:Random,ThreadLocalRandom,SecureRandom

 

文中的html

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?
java

A:特別是在生成驗證碼的狀況下,不要使用Random,由於它是線性可預測的。記得有個新聞說的是一個賭博網站,爲了說明其公平,公開的它的源代碼,結果由於隨機數可預測漏洞被攻擊了。因此在安全性要求比較高的場合,應當使用SecureRandom。算法

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

參考: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 plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. new UUID(ThreadLocalRandom.current().nextLong(), ThreadLocalRandom.current().nextLong());  

在一個網站上看到的,忘記出處了。


隨機生成產生隨機數的函數?
是否能夠利用一個隨機數生成器來生成一系列的隨機代碼,而後做爲一個新的隨機數生成器?貌似強度是傳遞的,彷佛沒意義。
多線程

相關文章
相關標籤/搜索