PHP的rand函數是非常常用的隨機數生成函數,但是大家是否知道rand的隨機性和安全性呢?今天我們就來探討一下如何使用rand函數才能保證其安全性。
首先,我們需要了解一下rand函數到底有多安全。我們用下面這個簡單的程序來演示。
for($i=0;$i<1000;$i++){ echo rand(1,10) . "<br />"; }
這個程序會輸出1000個1到10的隨機數。我們可以運行這個程序多次,每次輸出結果可能都不一樣。但是同一次運行中,這1000個隨機數卻是不會變的。
反復運行這個程序,我們會發現,每次輸出結果是比較相似的,甚至可以說是有規律的。這是因為rand函數是基于共享內存中的隨機種子來生成隨機數的。如果這個隨機種子不太隨機,就會導致rand函數生成的隨機數也不夠隨機。
那么,如何保證rand函數生成的隨機數具有足夠的隨機性呢?這需要我們使用種子函數(seed function)來生成足夠隨機的種子。
下面這個例子展示了如何使用種子函數來保證rand函數生成的隨機數具有足夠的隨機性。
$seed = hexdec(bin2hex(openssl_random_pseudo_bytes(4))) % mt_getrandmax(); mt_srand($seed); for($i=0;$i<1000;$i++){ echo mt_rand(1,10) . "<br />"; }
這個程序用mt_srand函數給mt_rand函數設置了一個由openssl_random_pseudo_bytes函數生成的隨機種子。這個隨機種子是基于操作系統的熵值(如硬盤訪問時間、CPU時鐘周期數等)計算得到的,足夠隨機。
總之,為了保證rand函數生成的隨機數具有足夠的隨機性和安全性,我們應該使用種子函數來生成足夠隨機的種子,從而保證生成的隨機數具有足夠的隨機性。
下一篇CSS實現選項式面板