[英]PHP random string not actually random
我指的是PHP隨機字符串生成器的答案中的函數(我已經刪除了默認的$ length參數)。
因此,此代碼使用了該函數,但是由於某些原因,如果您運行此代碼,則會看到字符串在數組中多次出現! 那么,如果這真的是隨機的,我怎么能產生這些結果呢? 我是否需要修改某些內容以產生真正的隨機字符串?
function generateRandomString($length) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
$i = 0;
while ($i < 5000){
$r = '';
$r = generateRandomString(8);
$arr[$r][$i] = $r;
$i++;
}
foreach ($arr as $key=>$rand){
if(count($rand) > 1){
echo "$key has ".count($rand).' results<br>';
}
}
結果示例:
ASCn2Db1 has 2 results
4ceXoUgh has 2 results
fCdzjEAV has 2 results
QRkXxAUJ has 2 results
隨機不是唯一的。 扔一個骰子,您會多次獲得相同的數字。
我實際上遇到了PHP:如何生成一個隨機的,唯一的字母數字字符串? 這似乎回答了我的問題。 簡而言之,我們使用openssl_random_pseudo_bytes作為函數。 當使用4個字符運行時,我遇到了1x碰撞,但是在5個字符上,我什么都沒有生成。 所以對於8我應該沒事。
我為您在問題中引用的問題提供了答案 ,但是它被不安全的答案掩蓋了很深,我並不驚訝每個人都錯過了它。
您的代碼中導致大量重復值的錯誤在這里:
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
問題是rand()
。 如果您想要高質量的PHP隨機字符串生成器 ,則需要使用更好的隨機數生成器來為其供電。 您在這里有三個不錯的選擇:
random_int()
(僅PHP 7+) random_int()
的兼容接口 TL; DR使用random_int()
, 切勿使用rand()
或mt_rand()
。
即使使用安全的隨機數生成器,如果字符串較短且樣本量足夠大, 由於生日問題 , 也不可避免發生沖突 。 使用更長的字符串,它們的使用頻率將大大降低。
我記得前些時候讀過一篇有關此的文章, 后來又找到了 。
在本文中,他制作了一個位圖,顯示了在Windows上運行的隨機函數,而不是完全隨機的。
我建議您使用mt_rand()代替,您可以在此處詳細了解mt_rand()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.