簡體   English   中英

PHP隨機字符串實際上不是隨機的

[英]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_compat ,在PHP 5項目(5.2+)中公開了random_int()的兼容接口
  • RandomLib (PHP 5.3.2+)

TL; DR使用random_int()切勿使用rand()mt_rand()

即使使用安全的隨機數生成器,如果字符串較短且樣本量足夠大, 由於生日問題也不可避免發生沖突 使用更長的字符串,它們的使用頻率將大大降低。

我記得前些時候讀過一篇有關此的文章, 后來又找到
在本文中,他制作了一個位圖,顯示了在Windows上運行的隨機函數,而不是完全隨機的。

我建議您使用mt_rand()代替,您可以在此處詳細了解mt_rand()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM