使用 SecureRandom 產生隨機數 坑

2022-09-21 20:03:13 字數 1435 閱讀 5049

背景:

專案裡用到 random 的地方定義一下 random 變數(如下)

在用 sonar 進行檢查時,sonar 建議使用securerandom.getinstancestrong()來初始化,如下:

private random rand = securerandom.getinstancestrong();

於是將其改成 sonar 建議的形式來生成隨機數

問題:

發版全量結果問題來了,第三方介面呼叫超時,從我們的監控來看,介面執行阻塞超時,看起來像陷入了某種死迴圈。

問題排查:

復現問題:首先使用了相同的請求引數在預發進行了測試,但令人不解的是,問題無法復現。隨後又測試了線上機器,可以穩定的復現問題。這時一臉黑人問號。

打日誌:為了定位問題,在**的關鍵位置插入日誌,經過多次的發布定位到問題,執行到securerandom.getinstancestrong()方法後就阻塞了。

問題原因:

securerandom.getinstancestrong() 方法在 linux 環境下使用 /dev/random 生成種子。但是 /dev/random 是乙個阻塞數字生成器,如果它沒有足夠的隨機資料提供,它就一直等,這迫使 jvm 等待。鍵盤和滑鼠輸入以及磁碟活動可以產生所需的隨機性或熵。但在乙個缺乏這樣的活動伺服器,可能會出現問題,當系統的熵池中數量不足時,就會阻塞當前執行緒。

該介面會返回指定位元組數的隨機數。random 裝置了提供了 2 個字元裝置供使用者態程序使用——/dev/random 和/dev/urandom:

解決方法:

有了以上的的解釋,我們就知道解決方案了,使用/dev/urandom這種非阻塞的方式來產生隨機數即可,在 j**a 中我們這樣寫即可

securerandom random = new securerandom();

new securerandom() 使用 /dev/urandom 生成種子,不會產生阻塞

母牛產牛問題

一頭母牛從出生後,每兩年可以生下一頭母牛,即在第二年和第四年分別可產下一頭母牛,出生後第五年將會死去。假設農場現有一頭母牛,n年後農場的母牛數目是多少,編寫程式實現 用五個數字或陣列來記錄當前歲數的牛的個數,每增長一年的時候都會年長一歲的個數變為上次小一歲的個數,即x4 x3 x3 x2 x2 x1...

presto無法讀取hive on tez產生的表

原因 在hive中使用tez模式時,發現tez的輸出結果在對應表目錄中,生成了子目錄,造成未配置tez的hive客戶端對該錶進行讀取時,無法獲取到資料。檢視對應的sql,發現存在insert union操作,檢視往上資訊,發現tez對於insert union操作會進行優化,通過並行加快速度,為防止...

python作排產計畫表 排產計畫表 doc

浙江丹碧華服飾 生產計畫排程表 浙江丹碧華服飾 生產輔料到位情況跟進表 注 按生產計畫排程表所確定的時間提前進行跟進管理,以保障各個生產工序的流暢。篇二 生產計畫排工表生產 計畫排工 表篇三 生產計畫排產交貨計畫 生產計畫排產 原料交貨計畫 日生產 erp中目前下達的工單,是乙個週期性的工單,mrp...