【问题标题】:PHP random string generator more random than expectedPHP 随机字符串生成器比预期的更随机
【发布时间】:2012-05-22 19:46:53
【问题描述】:

我一直在用它来给一个随机的 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 不是数组,$ch 中不包含空格。嗯...
  • @ShivanRaptor $string[3] 映射到字符串中的特定字符。
  • 刚刚测试了上面的代码。没有空格。
  • 我运行了 10k 次。没有空格(` `)!
  • 我认为您应该显示显示空格的完整代码

标签: php string random generator


【解决方案1】:

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


编辑:

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

仍然用单引号来排除问题(您可能还有其他变量正在被评估),但这不是问题。

危险人物描述here

【讨论】:

  • 我同意,可能是正在评估 $%,要么转义该字符,要么使用单引号
  • 对$ch 使用单引号以避免解析其内容。
  • 不,它不会评估 $%。我已经测试过了。
  • 那么字符串中的危险字符是什么?例如,它以 JSON 的形式传递,所以无论如何我都考虑过取消大括号。
【解决方案2】:

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

【讨论】:

  • 如果我将一个保存为 cookie 会怎样? (我愿意。)这会搞砸吗?我应该避免使用哪些字符?
  • 通常所有 cookie 在发送到浏览器时都经过 urlencoded 并在 PHP 中进行 urldecode。我不认为这是个问题。
  • 另一个想法:你在读取cookie的时候使用setrawcookie()设置cookie和$_COOKIE数组吗?如果是 - 你得到了错误。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    为什么不直接使用:

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

    【讨论】:

    • 有趣。你测试过哪个更快?
    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2013-10-01
    • 2014-02-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多