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

3
我一直在使用这个方法对随机生成的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
} 

实际上,在字符串中它可以包含一个空格。这是意料之外的!

为什么会这样呢?它将下划线视为空格吗?它一直导致随机的(直到现在还无法跟踪的)错误。

谢谢。


@ShivanRaptor $string[3] 将映射到字符串中的特定字符。 - Dunhamzzz
2
刚刚测试了上面的代码。没有空格。 - jimpic
我运行了它10k次。 - Shiplu Mokaddim
@Dunhamzzz 倾向于使用 substr() 来捕获异常。 - Raptor
1
我认为你应该展示显示空格的完整代码。 - Shiplu Mokaddim
显示剩余8条评论
4个回答

3
试着(未经测试)将$ch字符串周围的引号改为单引号。这样可以防止花括号被“评估”。

编辑:

经过一些测试后更新 - 它不是按原样转换的 - 所以代码中还有其他问题。刚刚进行了10万次测试,没有空格。

仍然将其放置为单引号以排除该问题(您可能有其他正在评估的变量),但这本身不是问题所在。

危险字符在这里描述


我同意,可能正在评估$%,要么转义该字符,要么使用单引号。 - Jamie Bicknell
使用单引号$ch来避免解析其内容。 - Raptor
不,它不会评估 $%。我已经测试过了。 - Shiplu Mokaddim
那么字符串中的危险字符是什么呢?例如,它作为JSON传递,因此我已经考虑过去掉大括号。 - Nick

1
为什么不只使用:

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

有趣。你测试过哪个更快吗? - Nick

1

你的函数看起来很不错。我认为可能的情况是在代码后面应用了一些解码函数来处理结果字符串。例如,"M0i/%20=3ia5" 经过 urldecode 后会变成 "M0i/ =3ia5"。


如果我将其中一个保存为cookie会怎样?(我这样做了。)那会不会出问题?有哪些字符应该避免使用? - Nick
通常情况下,所有的Cookie在发送到浏览器时都会进行URL编码,并在PHP中进行URL解码。我认为这不是一个问题。 - Eugene
1
另一个想法:您是否使用setrawcookie()来设置cookie和读取cookie时的$_COOKIE数组?如果是,那么您就有了一个错误。 - Eugene

1
你可能最终会生成HTML实体。想象一下,如果你的代码生成了&nbsp或者&#160,那么字符串中就会出现一个空格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接