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


PHP random string generator more random than expected

我一直在使用它来随机分配一个 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
} 

事实证明,在实践中它可以在字符串中包含空格。这是意料之外的!

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

谢谢。

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


编辑:

只是为了在经过一些测试后进行更新 - 它不是"按原样"转换 - 所以代码中还有其他东西导致了问题。只是在没有空格的情况下运行了 100,000 多次。

仍然作为单引号来排除该问题(您可能还有其他变量正在被评估),但仅此而已不是问题。

危险字符描述如下

你的函数看起来不错。我认为可能的情况是您在代码后面对生成的字符串应用一些解码功能。例如,urldecode后面的"M0i/%20=3ia5"看起来像"M0i/=3ia5"。

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

为什么不直接使用:

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