Linux 獲取隨機數
- 偽隨機法
偽隨機法就是通過一個確定性的演算法來獲取看似隨機或者亂序,在計算偽隨機序列時,如果使用的開始值不變化的,實際上獲取到的隨機序列的值順序是保持不變。例如在C中比較常用的隨機函式rand(),是比較典型的偽隨機法。
在呼叫rand()函式時,沒有顯示的呼叫srand()函式來設定隨機序列開始種子的話,預設隨機序列的種子即為1,此時的隨機序列為:1804289383
846930886、1681692777、1714636915、1957747793、424238335、719885386、1649760492。
rand()函式是實現在glibc庫中,運行於使用者態,執行效率比較高效;
- 真隨機法
真隨機法,在在計算機環境中,主要是依賴於計算機環境中的背景操作,例如來自驅動程式或者其他來源的背景噪聲。真隨即法具有不可預測和再現性,原因在於產生隨機數的作業系統所處的環境充滿了未知性。在Linux中,/dev/random產生的是真正的隨機數序列。
隨機函式發生器通過驅動程式或者其他來源來獲取環境噪聲來計算出一個隨機數,同時將產生的隨機數放入到隨機數池中,每次需要隨機數時,從池中獲取一個數據數即可,如果隨機池已空,從/dev/random讀取資料時,將會被阻塞,直到新的隨機數被放入到池中才會返回,這個地方無疑是個巨大的坑,當面對大量的請求需要隨機數時。
/dev/unrandom,也是從隨機池中獲取一個隨機數,與/dev/random的區別點在於隨機池為空時,隨機數的程度不夠高。
呼叫/dev/(u)random獲取隨機數的方法,相比rand()方法效率會低很多,每獲取一次random值,均需要發起一次系統呼叫,來呼叫該值。
示例程式碼為:
FILE *fs_p = NULL;
fs_p = fopen ("/dev/urandom", "r");
fread(&seed, sizeof(int), 1, fs_p); //obtain oneunsigned int data
fclose(fs_p);