随机函数生成2个长字符串相同,是运气不好还是rand()不是随机的?

时间:2014-08-01 17:49:44

标签: php random

今天我用RAND()函数遇到了一个奇怪的问题。 我编写了一个会话管理类,使用我编写的这个函数生成随机会话ID

private function generateSessionID($len = 40) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,-';
    $newStr = '';
    $maxLen = strlen($characters)-1;
    for ($i = 0; $i < $len; ++$i) 
        $newStr .= $characters[rand(0, $maxLen)];

    return $newStr;
}

问题是在同一天生成了两个随机字符串,导致一个用户以其他人身份登录!怎么会发生这种情况?是否有一个简单的步骤rand()所以它回来并重新生成相同的方式?是什么导致它再次产生同样的东西?

通过做一些研究,我了解到使用mt_rand()rand()要好得多,而且我也使用了str_shuffle()所以我将功能切换到了这个

private function generateSessionID($len = 40) {
    $characters = str_shuffle('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,-');
    $newStr = '';
    $maxLen = strlen($characters)-1;
    for ($i = 0; $i < $len; ++$i) 
        $newStr .= $characters[mt_rand(0, $maxLen)];

    return $newStr;
}

有人可以帮我理解这里可能出现的问题吗?为什么两个&#34; 40个字符&#34;字符串是在一天内生成的?

由于

1 个答案:

答案 0 :(得分:0)

嗯,随机的确是随机的。使用随机数并不能保证每次都有一个唯一的40个字符串,它能做的最好的事情就是很有可能它不会生成相同的字符串。这是会话ID的抽奖,有人恰好在那天赢了彩票。

如果你想保留当前的发生器,我会做的是生成会话ID,检查它是否已被使用,以及它是否再次调用该函数,直到你得到一个唯一的。或者你可以做一些事情,比如生成你的随机ID,在它上面添加一个时间戳,然后哈希吧。