成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java隨機數的陷阱

開發 后端
隨機數我們應該不陌生,業務中我們用它來生成驗證碼,或者對重復性要求不高的id,甚至我們還用它在年會上搞抽獎。今天我們來探討一下這個東西。如果使用不當會引發一系列問題。

前言

隨機數我們應該不陌生,業務中我們用它來生成驗證碼,或者對重復性要求不高的id,甚至我們還用它在年會上搞抽獎。今天我們來探討一下這個東西。如果使用不當會引發一系列問題。

[[276557]]

Java中的隨機數

我們需要在Java中隨機生成一個數字。java開發中我們通常使用java.util.Random來搞,它提供了一種偽隨機的生成機制。Jvm 通過傳入的種子(seed)來確定生成隨機數的區間,只要種子一樣,獲取的隨機數的序列就是一致的。而且生成的結果都是可以預測的。是一種偽隨機數的實現,而不是真正的隨機數。來確定使用的但是有些用例直接使用可能會導致一些意想不到的問題。Random的一個普遍用法:

  1. // Random 實例 
  2. Random random = new Random(); 
  3. //調用 nextInt() 方法 此外還有nextDouble(), nextBoolean(), nextFloat(), ... 
  4. random.nextInt(); 

或者,我們可以使用java中的數學計算類:

  1. Math.random(); 

Math類只包含一個Random實例來生成隨機數:

  1. public static double random() { 
  2.  Random rnd = randomNumberGenerator; 
  3.  if (rnd == null) { 
  4.  // 返回一個新的Random實例 
  5.  rnd = initRNG(); 
  6.  } 
  7.  return rnd.nextDouble(); 
  8.  } 

java.util.Random的用法是線程安全的。但是,在不同線程上并發使用相同的Random實例可能會導致爭用,從而導致性能不佳。其原因是使用所謂的種子來生成隨機數。種子是一個簡單的數字,它為生成新的隨機數提供了基礎。我們來看看Random中的next(int bits)方法:

  1. protected int next(int bits) { 
  2.  long oldseed, nextseed; 
  3.  AtomicLong seed = this.seed; 
  4.  do { 
  5.  oldseed = seed.get(); 
  6.  nextseed = (oldseed * multiplier addend) & mask; 
  7.  } while (!seed.compareAndSet(oldseed, nextseed)); 
  8.  return (int)(nextseed >>> (48 - bits));} 

首先,舊種子和新種子存儲在兩個輔助變量上。在這一點上,創造新種子的原則并不重要。要保存新種子,使用compareAndSet()方法將舊種子替換為下一個新種子,但這僅僅在舊種子對應于當前設置的種子的條件下才會觸發。如果此時的值由并發線程操縱,則該方法返回false,這意味著舊值與例外值不匹配。因為是循環內進行的操作,那么會發生自旋,直到變量與例外值匹配。這可能會導致性能不佳和線程競爭。

多線程下的隨機數

如果更多線程主動生成具有相同Random的實例的新隨機數,則上述情況發生的概率越高。對于生成許多(非常多)隨機數的程序,不建議使用這種方式。在這種情況下,您應該使用ThreadLocalRandom,它在1.7版本中添加到Java中。ThreadLocalRandom擴展了Random并添加選項以限制其使用到相應的線程實例。為此,ThreadLocalRandom的實例保存在相應線程的內部映射中,并通過調用current()來返回對應的Random。使用方式如下:

  1. ThreadLocalRandom.current().nextInt() 

安全的隨機數

通過對Random的一些分析我們可以知道Random事實上是偽隨機,是可以推導出規律的,而且依賴種子(seed)。如果我們搞抽獎或者其他一些對隨機數敏感的場景時,用Random就不合適了,容易被人鉆空子。JDK提供了SecureRandom來解決這個事情。

SecureRandom是強隨機數生成器,它可以產生高強度的隨機數,產生高強度的隨機數依賴兩個重要的因素:種子和算法。算法是可以有很多的,通常如何選擇種子是非常關鍵的因素。 Random的種子是System.currentTimeMillis(),所以它的隨機數都是可預測的, 是弱偽隨機數。強偽隨機數的生成思路:收集計算機的各種信息,鍵盤輸入時間,內存使用狀態,硬盤空閑空間,IO延時,進程數量,線程數量等信息,CPU時鐘,來得到一個近似隨機的種子,主要是達到不可預測性。說的更通俗就是,使用加密算法生成很長的一個隨機種子,讓你無法猜測出種子,也就無法推導出隨機序列數。

總結

今天我們探討了業務中經常使用的隨機數的一些機制和一些場景下的一些陷阱,希望你在使用隨機數的時候能避免這種陷阱。

 

責任編輯:華軒 來源: segmentfault
相關推薦

2012-03-22 09:31:14

Java

2011-07-08 15:11:03

JAVA

2009-06-11 15:16:18

不重復隨機數Java

2015-10-13 10:00:58

Swift隨機數使用總結

2021-12-27 09:31:20

HashtableJava隨機數

2024-11-01 15:51:06

2025-01-17 00:00:00

Java隨機數服務

2023-01-03 07:49:45

Java隨機數線程

2021-06-01 22:31:57

區塊鏈隨機數技術

2010-10-09 15:35:25

MySQL rand函

2024-01-25 11:32:21

2010-03-22 19:41:31

2017-05-29 09:56:25

2009-12-08 11:44:14

PHP獲取隨機數

2010-09-06 17:40:59

SQL函數

2014-05-13 10:21:00

2009-06-17 17:37:43

Java隨機數

2009-12-02 17:01:01

PHP隨機數rand()

2009-12-08 12:58:33

PHP隨機數類

2010-07-15 13:34:32

Perl隨機數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲性综合网 | 中文无码日韩欧 | 91精品国产91久久久久久 | 日韩精品视频在线观看一区二区三区 | 成人性视频免费网站 | 国产精品亚洲片在线播放 | 另类 综合 日韩 欧美 亚洲 | 亚洲国产成人在线视频 | 国产欧美日韩一区二区三区在线观看 | 欧美 日韩 国产 在线 | 免费在线观看av片 | 久久精品国产久精国产 | 国产高清久久久 | 男人av的天堂 | av国产精品 | 美女视频一区二区 | 91久久国产综合久久 | 狠狠涩 | 国产精品久久午夜夜伦鲁鲁 | 人人干视频在线 | 国产精品观看 | av中文在线观看 | 一区二区视频在线观看 | 狠狠做深爱婷婷综合一区 | 一区二区三区免费 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 国产99热| 男女那个视频 | 91原创视频 | 毛片一级电影 | 999热视频| 国产免费一区二区三区最新6 | 在线视频第一页 | 国产精品一区二区不卡 | 精品视频久久久久久 | 香蕉视频一区二区 | 免费精品 | 午夜小视频在线播放 | 久久精品性视频 | 欧美一区二区三区在线观看视频 | 成年人在线观看 |