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

PHP随机字符串生成器比预期更随机,php,string,random,generator,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++

我一直在用它来定义一个随机的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
} 
//lost-in-code.com/programming/php-code/php-random-string-with-number-and-letter
$ch=“0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@$%^&({}[]+=-|/?|*#”;
$sc=”“;
对于($p=0;$p<12;$p++){
$sc.=$ch[mt_rand(0,82)];//83是字符的序列号
} 
事实证明,实际上它可以在字符串中包含空格。这是出乎意料的

为什么会这样?它是否将下划线视为空格?它一直在造成随机(到目前为止,无法追踪)的错误

谢谢。

根据猜测(未经测试)将$ch字符串周围的引号更改为单引号。停止“计算”大括号


编辑:

只是在一些测试之后进行更新-它不是“按原样”转换-所以代码中还有其他东西导致了问题。只是在没有空间的情况下运行了100000次

仍然使用单引号来排除该问题(您可能还有其他变量需要计算),但这并不是问题所在


危险字符已被描述

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

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

为什么不使用:

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

$ch
不是数组,
$ch
中不包含空格。嗯…@ShivanRaptor
$string[3]
映射到字符串中的特定字符。刚刚测试了上述代码。没有空格,我跑了10公里。没有空格(``)!我认为您应该显示显示空格的完整代码。我同意,可能是正在计算$%,或者转义该字符,或者使用单引号使用单引号
$ch
以避免对其内容进行解析。不,它不计算
$%
。我已经测试过了。那么字符串中的危险字符是什么呢?例如,它以JSON的形式传递,所以我考虑过删除大括号。如果我将其中一个保存为cookie呢?(我知道。)这会把事情搞砸吗?我应该避免使用什么字符?通常所有cookie在发送到浏览器时都是URL编码的,并在PHP中进行URL解码。我不认为这是一个问题。另一个想法是:在读取cookie时,是否使用setrawcookie()设置cookie和$\u cookie数组?如果是的话,你有错误。很有趣。你测试过哪个更快吗?