【问题标题】:Random string generator随机字符串生成器
【发布时间】:2013-05-25 16:55:26
【问题描述】:

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

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

【问题讨论】:

  • do { CREATE_RANDOM_STRING } while (!CONTAINSLOWERCASELETTER || !CONTAINSUPPERCASELETTER || !CONTAINSSYMBOL) 怎么样?
  • 我认为您需要检查您的字符串是否符合您的要求,如果不符合,请创建一个新字符串或对其进行修改,直到符合要求为止。

标签: php logic


【解决方案1】:

我不太了解 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 好像很有用。

【讨论】:

    【解决方案2】:

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

    do {
        $string = generateRandomString(10);
    } while(!check_password_rules($string))
    
    function check_password_rules($string) {
        // return true if password fits policy
    }
    

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

    【讨论】:

    • 这个解决方案,结合str_shuffle,正如@Justin 和@SB 所建议的那样,正是我想要的。这样它就尽可能地随机了。谢谢大家。
    【解决方案3】:

    您可以建立您的列表,然后使用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);
    

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 2011-06-30
      相关资源
      最近更新 更多