随机字符串生成器使字符串长度错误(PHP)

时间:2017-04-08 02:15:15

标签: php

我试图创建一个生成随机字符串的函数,但字符串有时是错误的长度。     

function getRandomName($maxChars)
{
    $nameChars = str_split("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");
    $numOfChars = count($nameChars); // amount of characters in $nameChars
    $randomString = "";
    for($count=0;$count<$maxChars;$count++)
    {
        $randomInt = round(rand(0,$numOfChars));
        $selectedChar = $nameChars[$randomInt]; // random character in $nameChars
        $randomString .= $selectedChar; // adds to string
    }
    echo " ".strlen($randomString).", "; // length, string is echoed later
    return $randomString;
}
exit(getRandomName(6)); // 6 characters long

?>

大多数情况下,结果将类似于6, s2jd8q。但有时,结果类似于5, d82kw。我只想要6个字符长的字符串,而不是5个字符串。 任何人都知道如何解决这个问题?

5 个答案:

答案 0 :(得分:0)

$randomInt = round(rand(0,$numOfChars));修改为$randomInt = round(rand(0,$numOfChars-1));

如果你运行

$nameChars = str_split("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");
$numOfChars = count($nameChars); // amount of characters in $nameChars
//$numOfChars = 62

echo($nameChars[61]); //Output: 0 (Last character)

答案 1 :(得分:0)

我有同样的问题!不知怎的,我设法解决了这个问题!这是我生成随机字符串的ErrorLess函数。

public static function generateKey($length)
{
        $str = "";
        $chars = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ^*(_=?+|%-";
        $charlen = strlen($chars);
        for($i=0;$i<$length;$i++)
        {
            $str .= $chars[rand(0,$charlen-1)];
        }

        return $str;
}

此功能易于理解和工作,没有任何长度错误!让我知道它是否有帮助!

您可以根据需要更换角色!

答案 2 :(得分:0)

我之前做过这个,它与其他类似,但使用substr()函数。这是:

function randomKey($length = 32) {
    $key = '';
    $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

    for ($i = 0; $i < $length; $i++) {
        // Get 1 random char from 0 to characters length
        $key .= substr($characters, rand(0, strlen($characters) - 1), 1);
    }

    return $key;
}

echo randomKey();

希望你也觉得这很有用。问候。

答案 3 :(得分:0)

我总是使用此函数生成自定义随机字符串...

<?php
  function random_alphanumeric($length) {
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12345689';
    $my_string = '';
    for ($i = 0; $i < $length; $i++) {
      $pos = mt_rand(0, strlen($chars) -1);
      $my_string .= substr($chars, $pos, 1);
    }
    return $my_string;
  }
  $test = random_alphanumeric(50); // 50 characters
  echo $test;
?>

打印输出:rqY4ePLhQYvu5d5m8Mfvcj8ZiYQbPu5tOzuIcMeWR5thmrlYpt

如果您需要两个唯一的字符串,我建议您使用这种方法...

$string_1 = random_alphanumeric(50);
$string_2 = random_alphanumeric(50);
while ($string_1 == $string_2) {
  $string_1 = random_alphanumeric(50);
  $string_2 = random_alphanumeric(50);
  if ($string_1 != $string_2) {
     break;
  }
}
echo $string_1;
echo "<br>\n";
echo $string_2;

$ string_1:fX9KdYyFeF5JA5ceJpHTKy2uXaijwVvKsJlt288Xxg2q89BrNf

$ string_2:g9RG4kdLgxxhu8QzmkWHH4eyH1WCaUjYaALejR26Nnzjvqmjw1

如果您发现我的答案有用,请给我投票:)

答案 4 :(得分:0)

这里是一个解决方案,它使用字符数组处理,避免使用substr并转换为数组。它比此处发布的所有其他解决方案要快得多。

function randomString($length)
{
  $out = '';
  for($i = 0; $i < $length; ++$i)
    switch(mt_rand(0, 2))
    {
      case 0: $out .= char(mt_rand(48,  57)); break;
      case 1: $out .= char(mt_rand(65,  90)); break;
      case 2: $out .= char(mt_rand(97, 122)); break;
    }
  return $out;
}