【问题标题】:generating a random code in php?在php中生成随机代码?
【发布时间】:2010-12-31 15:51:52
【问题描述】:

我知道这可能看起来很傻,但我想使用 php 生成一个 8 个字符的随机代码,只有数字或字母。我需要这个来为每个注册的用户生成一个密码,谢谢

【问题讨论】:

  • 你用谷歌搜索过“php 随机密码生成器” - 有很多点击...

标签: php random


【解决方案1】:

为了方便起见,像这样的东西怎么样:

$pass = substr(md5(uniqid(mt_rand(), true)) , 0, 8);

【讨论】:

    【解决方案2】:

    这项工作就像魅力一样,您可以选择将生成的字符类型,例如:
    “upper_case”、“lower_case”、“number”、“special_character”

    function create_random_code($length = 8, $in_params = [])
    {
        $in_params['upper_case']        = isset($in_params['upper_case']) ? $in_params['upper_case'] : true;
        $in_params['lower_case']        = isset($in_params['lower_case']) ? $in_params['lower_case'] : true;
        $in_params['number']            = isset($in_params['number']) ? $in_params['number'] : true;
        $in_params['special_character'] = isset($in_params['special_character']) ? $in_params['special_character'] : false;
    
        $chars = '';
        if ($in_params['lower_case']) {
            $chars .= "abcdefghijklmnopqrstuvwxyz";
        }
    
        if ($in_params['upper_case']) {
            $chars .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        }
    
        if ($in_params['number']) {
            $chars .= "0123456789";
        }
    
        if ($in_params['special_character']) {
            $chars .= "!@#$%^&*()_-=+;:,.";
        }
    
        return substr(str_shuffle($chars), 0, $length);
    }
    

    使用它:

    echo create_random_code(
        6,
        [
            'upper_case'        => true,
            'lower_case'        => true,
            'number'            => true,
            'special_character' => false
        ]
    );
    

    【讨论】:

      【解决方案3】:

      一个好的或有效的方法是:

      public function generateRandomString($length = 8) {
          $characters = '0123456789abcdefghijklmnopqrs092u3tuvwxyzaskdhfhf9882323ABCDEFGHIJKLMNksadf9044OPQRSTUVWXYZ';
          $charactersLength = strlen($characters);
          $randomString = '';
          for ($i = 0; $i < $length; $i++) {
              $randomString .= $characters[rand(0, $charactersLength - 1)];
          }
          return $randomString;
      }
      

      通过更改 $length 变量,您可以根据需要生成字母数字代码。

      【讨论】:

        【解决方案4】:
        <?php 
        
        $uniqid = uniqid();
        
        $rand_start = rand(1,5);
        
        $rand_8_char = substr($uniqid,$rand_start,8);
        
        ?>
        

        【讨论】:

        • 你可能想加盐,否则黑客可能会利用。这是一个长远的目标,但仍有可能。
        • 我认为“远射”是轻描淡写。 ;)
        • 不过,一些黑客所拥有的是时间:-)
        • 很好!没有按照您告诉我的原则去做,但是我将子字符串的起始位置设为随机。更好的? ;)
        • 我只是做了一点研究,看来这整个来回都是徒劳的,您可以将 true 添加到 uniqid() 的第二个参数,它会为唯一值添加熵: -)
        【解决方案5】:

        我宁愿用md5生成密码

        但如果你想要一个自定义,你可以使用这样的东西:

        function createRandomPassword() { 
        
            $chars = "abcdefghijkmnopqrstuvwxyz023456789"; 
            srand((double)microtime()*1000000); 
            $i = 0; 
            $pass = '' ; 
        
            while ($i <= 7) { 
                $num = rand() % 33; 
                $tmp = substr($chars, $num, 1); 
                $pass = $pass . $tmp; 
                $i++; 
            } 
        
            return $pass; 
        
        } 
        

        【讨论】:

        • 使用md5() 的想法,您可以使用您现在正在返回的$pass,而不是使用return substr(md5($pass), 0, 8);
        • 我认为 L 和 1 是故意留下的!因为他们长得很像?
        • 与 md5 或其他哈希函数相比,它的优势在于您可以省略看起来相似的字符,例如上面的示例省略了 L 和 1。
        • 我现在会使用这样的东西:``` $chars = "abcdefghijkmnopqrstuvwxyz023456789"; $i = 0; $token = '';而 ($i
        【解决方案6】:

        使用base64_encode(),输入一些rand() 数字,并剪掉前8 个字符,这肯定是字母或数字。这不是一个完全随机的组合,因为输入只是整数。但这对于默认用户密码来说已经足够了。 (否则在编码前通过chr() 使用rand()。)

        【讨论】:

          【解决方案7】:

          PHP 有一个 rand 函数(还有一个文档声称更快的 mt_rand 函数。)

          所以做这样的事情:

          $i = 0;
          $pwd = "";
          while ( $i < 10) {
              if (mt_rand() % 2 == 0) {
                  $pwd .= rand();
              } else {
                  $pwd .= char(rand());
                  // http://php.net/manual/en/function.chr.php
              }
              $i += 1;
          }
          

          【讨论】:

          • 另一种选择是通过设置允许的最小和最大数量仅使用一次rand(),即-$pwd = rand(10000000, 99999999);
          • @Patrick -- 好主意!如果速度是个问题,那么您可以用单独的字符串连接或对 char 的调用来替换内部随机调用。
          【解决方案8】:

          出于您的目的,您可以使用以下方法生成随机码:

          bin2hex(random_bytes(10))
          

          请注意,这里我们使用random_bytes,它是在 PHP 7 中引入并使用加密随机生成器,如果您希望随机代码难以猜测,这一点很重要。 random_int 也在 PHP 7 中引入,同样使用加密随机生成器。

          许多其他用于随机值生成的解决方案,包括涉及time()microtime()uniqid()rand()mt_rand()str_shuffle()array_rand()shuffle() 的解决方案还有很多如果随机字符串用作密码、承载凭证、随机数、会话标识符、“验证码”或“确认码”或其他秘密值,则可预测且不适合。

          上面的代码生成一个由 20 个十六进制字符组成的字符串(0 到 9,或 A 到 F)。如果你想使用更大的字符集(比如所有大写字母、所有小写字母和10位数字),这是一个更复杂的过程,但你必须使用random_int而不是rand()mt_rand()str_shuffle() 等,如果字符串将用作密码、“确认码”或其他秘密值。请参阅answer to a related question

          在生成唯一标识符时,我还会列出other things to keep in mind,尤其是随机标识符。

          【讨论】:

            猜你喜欢
            • 2011-08-31
            • 2013-05-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-19
            • 1970-01-01
            • 1970-01-01
            • 2021-06-18
            • 2016-08-27
            相关资源
            最近更新 更多