今天我用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;字符串是在一天内生成的?
由于
答案 0 :(得分:0)
嗯,随机的确是随机的。使用随机数并不能保证每次都有一个唯一的40个字符串,它能做的最好的事情就是很有可能它不会生成相同的字符串。这是会话ID的抽奖,有人恰好在那天赢了彩票。
如果你想保留当前的发生器,我会做的是生成会话ID,检查它是否已被使用,以及它是否再次调用该函数,直到你得到一个唯一的。或者你可以做一些事情,比如生成你的随机ID,在它上面添加一个时间戳,然后哈希吧。