随机字符串生成器

时间:2013-05-25 16:55:27

标签: php logic

我必须生成一个固定长度为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;
    }

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

3 个答案:

答案 0 :(得分: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似乎很有用。

答案 1 :(得分: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);

答案 2 :(得分:2)

如果您的发电机不需要非常快,您可以这样做:

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

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

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