PHP随机字符串生成器比预期更随机

时间:2012-05-15 10:00:45

标签: php string random generator

我一直在使用这个性别随机的12个字符串:

//  lost-in-code.com/programming/php-code/php-random-string-with-numbers-and-letters
$ch = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@$%^&(){}[]+=-_/?|*#";
$sc = "";    
for ($p = 0; $p < 12; $p++) {
    $sc .= $ch[mt_rand(0,82)];  // 83 is the strlen of characters
} 

事实证明,它在实践中可以在字符串中包含空格。这不是预期的!

为什么会这样?它是否将下划线视为空间?它导致了随机(并且直到现在,无法追踪)的错误。

感谢。

4 个答案:

答案 0 :(得分:3)

猜测(未测试)将$ ch字符串周围的引号更改为单引号。阻止大括号被“评估”


编辑:

只是在经过一些测试后更新 - 它不是“按原样”转换 - 所以代码中的其他东西会导致问题。只运行了100,000次而没有空格。

仍然作为单引号来规定该问题(您可能有其他变量正在评估中),但仅此一点不是问题。

描述了危险字符here

答案 1 :(得分:1)

你的功能很好看。我认为可能的情况是您在代码中稍后对结果字符串应用一些解码函数。例如,urldecode后的“M0i /%20 = 3ia5”将显示为“M0i / = 3ia5”。

答案 2 :(得分:1)

您最终可能会生成html实体。想象一下,如果您的代码生成&nbsp&#160,例如,字符串中会出现一个空格。

答案 3 :(得分:1)

为什么不使用:

    $length = 12;
    $randomString = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, $length);
    echo $randomString;