1

我必须生成一个固定长度为 10 个字符的随机字符串。但诀窍是它必须至少包含一个小写字母、一个大写字母、一个数字和以下符号之一:`~!@#$%^&*()_-+={}[]|:;" '<>,.?/

我之前使用过这个简单的功能:

function generateRandomString($length = 10)
{
    $characters='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()_-+={}[]|:;"\'<>,.?/';
    $result = '';
    for ($i = 0; $i < $length; $i++)
        $result .= $characters[rand(0, strlen($characters) - 1)];
    return $result;
}

但是此功能不包括所需的每种字符类型中的至少一种。即使我走另一条路:

function generateRandomString($length = 10)
{
    $dig = '0123456789';
    $low = 'abcdefghijklmnopqrstuvwxyz';
    $upp = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $sym = '`~!@#$%^&*()_-+={}[]|:;"\'<>,.?/';
    $result = '';

    for ($i = 0; $i < $length; $i++)
    {
       $foo = rand(1,4);
       switch ($foo)
       {
           case 1:
               $result .= $dig[rand(0, strlen($dig)-1)];
               break;
           case 2:
               $result .= $low[rand(0, strlen($low)-1)];
               break;
           // etc.
       }
        return $result;
    }

这仍然不一定包含每个中的至少一个。所有字符必须随机放置。所以任何帮助将不胜感激。谢谢你。

4

3 回答 3

5

我不太了解 PHP,但我想你可以做这样的事情(原谅语法错误):

$result = "";
$result .= $dig[rand(0, strlen($dig) - 1];
$result .= $low[rand(0, strlen($low) - 1];
$result .= $upp[rand(0, strlen($upp) - 1];
$result .= $sym[rand(0, strlen($sym) - 1];

// at this point, you have one of each
// Go through your for loop 6 more times, and then finally:

$result = str_shuffle($result)

希望有帮助。 str_shuffle似乎很有用。

于 2013-05-25T17:02:07.650 回答
2

您可以构建您的列表,然后使用str_shuffle. 我确信这可以简化并写得更好,但这很有效。

我添加了一个百分比方法,这样你就可以拥有每个字符的一定百分比。

function generateRandomString($length = 10) {
    $result = getRandomString(.2 * $length, '0123456789');
    $result .= getRandomString(.3 * $length, 'abcdefghijklmnopqrstuvwxyz');
    $result .= getRandomString(.3 * $length, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
    $result .= getRandomString(.2 * $length, '`~!@#$%^&*()_-+={}[]|:;"\'<>,.?/');

    $str_len = strlen($result);
    if($str_len != $length) $result .= getRandomString($length - $str_len, 'abcdefghijklmnopqrstuvwxyz');

    return str_shuffle($result);
}

function getRandomString($length, $characters) {
    $result = '';
    $strlen = strlen($characters);
    for($i = 0; $i < floor($length); $i++) $result .= $characters[rand(0, $strlen - 1)];

    return $result;
}

echo generateRandomString(31);
于 2013-05-25T17:13:34.497 回答
2

如果您的生成器不需要非常快,您可以执行以下操作:

do {
    $string = generateRandomString(10);
} while(!check_password_rules($string))

function check_password_rules($string) {
    // return true if password fits policy
}

它的优点是您不会通过为字符组设置固定概率来牺牲任何随机性。

于 2013-05-25T17:20:12.097 回答