【问题标题】:php password generating functionphp密码生成函数
【发布时间】:2011-09-28 07:27:49
【问题描述】:

这是我想解决的问题

"编写一个函数 GeneratePassword,它接受两个参数,一个整数和一个由字母 (a-z) 和数字 (0-9) 组成的字符串。

当调用 GeneratePassword(5,'abc0123') 时,它应该返回从 'abc0123' 中获取的 5 个字符的随机字符串。

例如:GeneratePassword(7,'abczxc012394') 可以返回以下任何输出: 2c00acb 2c23z93 030b2a4 "

我已经为它写了下面的代码,但是系统说答案是错误的。请解释我做错了什么。

我的代码:

    function GeneratePassword($digits,$passwordString){
    if($digits > strlen($passwordString)) return '';
    else {
        $randomSelect = '';
        for($i=0;$i<$digits;$i++){
            $randomChar = $passwordString[rand(0, strlen($passwordString)-1)];
            $randomSelect = $randomSelect.$randomChar ;
            $passwordString = str_replace($randomChar,"",$passwordString);

        }
        return $randomSelect;
    }
}

【问题讨论】:

  • 您能否解释一下错误答案的含义。是您收到错误消息吗?
  • 只是验证,每个字符只能使用一次对吗?我的意思是,为了让你有两次,它必须在源字符串中出现两次,对吧?
  • 似乎正在工作:codepad.org/jbjZuMsd
  • 系统说什么?你能更好地解释你的问题吗?函数正确,输出正确。

标签: php function random


【解决方案1】:

首先,您不应该拒绝$digits 大于可供选择的字符数。您可以轻松收到GeneratePassword(10,'A'),在这种情况下您需要返回AAAAAAAAAA

其次,您不应该从字符串中删除选定的字符。这些示例甚至包括重复字符(例如2c00acb)。

除此之外,您的代码似乎可以正常工作。不过,我建议您预先计算 strlen($passwordString) 并将其保存在一个变量中,而不是为循环的每次迭代计算一次。

【讨论】:

  • 下面的代码在函数中做同样的事情 if($digits > strlen($passwordString)) return '';
  • @backTangent,你读过他的回答吗?它是正确的。
  • @BenLee 是的,我读过。我说错了什么。我刚才说他是写,只涉及一行,我可以去掉。
【解决方案2】:
function GeneratePassword($length,$characters) {

    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}
echo GeneratePassword(7, 'abczxc012394');

【讨论】:

    【解决方案3】:

    这是我要制作的版本。请注意,我已将“$digits”替换为“$length”,因为这就是它应该表示的内容。另外,我用更普遍接受的术语“$seed”替换了“$passwordString”。解释是内联的。

    function GeneratePassword( $length, $seed ) {
        $password = ''; /** Begin with an empty string. */
        $max = ( $length - 1 ); /** Calculate the number of characters in seed -1, because strings are zero-indexed. */
        for( $i = 0; $i < $length; $i ++ ) { /** Loop until the maximum length is reached. */
            $password .= $seed[mt_rand( 0, $max )]; /** Select a random character and append it to the password string. */
        }
        return $password; /** return the password */
    }
    

    【讨论】:

      【解决方案4】:
      function GeneratePassword($digits,$passwordString){
      
          $randomSelect = '';
          for($i=0;$i<$digits;$i++){
              $randomChar = $passwordString[rand(0, strlen($passwordString)-1)];
              $randomSelect = $randomSelect.$randomChar ;
              $passwordString = str_replace($randomChar,"",$passwordString);
      
          }
          return $randomSelect;
      
      }
      

      你应该重复使用 $passwordString 中的字符

      【讨论】:

        【解决方案5】:
        function GeneratePassword($n,$c){
          $pw = '';
          for ($l = 0; $l < $n; $l++){
            $r = rand(0, strlen($c) - 1);
            $pw .= $c[$r];
          }
          return $pw;
        }
        

        【讨论】:

          猜你喜欢
          • 2014-03-27
          • 2012-06-03
          • 1970-01-01
          • 2013-06-16
          • 2011-10-25
          • 2017-11-20
          • 2011-08-31
          • 2015-05-12
          • 1970-01-01
          相关资源
          最近更新 更多