PHP 随机字符串生成器

<?php
    function RandomString()
    {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $randstring = '';
        for ($i = 0; $i < 10; $i++) {
            $randstring = $characters[rand(0, strlen($characters))];
        }
        return $randstring;
    }

    RandomString();
    echo $randstring;

答案

具体地回答这个问题,有两个问题:

  1. 当您回显它时, $randstring不在范围内。
  2. 字符在循环中没有并置在一起。

这是包含更正的代码段:

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

通过以下调用输出随机字符串:

// Echo the random string.
// Optionally, you can give it a desired string length.
echo generateRandomString();

请注意,这会生成可预测的随机字符串。如果要创建安全令牌, 请参见此答案

注意: str_shuffle()内部使用rand() ,它不适合用于加密目的(例如,生成随机密码)。您需要一个安全的随机数生成器 。它还不允许字符重复。

另一种方式。

UPDATED (现在这会生成任何长度的字符串):

function generateRandomString($length = 10) {
    return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length);
}

echo  generateRandomString();  // OR: generateRandomString(24)

而已。 :)

这个问题有很多答案,但是都没有利用密码安全的伪随机数生成器 (CSPRNG)。

一个简单,安全且正确的答案是使用RandomLib,而不是重新发明轮子。

对于那些坚持发明自己的解决方案的人,PHP 7.0.0 将为此目的提供random_int() ;如果您仍在使用 PHP 5.x,我们random_int()编写了PHP 5 random_int()因此即使您升级到 PHP 7,也可以使用新的 API。

在 PHP 中安全地生成随机整数并不是一件容易的事。在生产中部署自行开发的算法之前,应始终与常驻 StackExchange 密码学专家联系

有了一个安全的整数生成器,用 CSPRNG 生成一个随机字符串就是在公园散步。

创建一个安全的随机字符串

/**
 * Generate a random string, using a cryptographically secure 
 * pseudorandom number generator (random_int)
 *
 * This function uses type hints now (PHP 7+ only), but it was originally
 * written for PHP 5 as well.
 * 
 * For PHP 7, random_int is a PHP core function
 * For PHP 5.x, depends on https://github.com/paragonie/random_compat
 * 
 * @param int $length      How many characters do we want?
 * @param string $keyspace A string of all possible characters
 *                         to select from
 * @return string
 */
function random_str(
    int $length = 64,
    string $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
): string {
    if ($length < 1) {
        throw new \RangeException("Length must be a positive integer");
    }
    $pieces = [];
    $max = mb_strlen($keyspace, '8bit') - 1;
    for ($i = 0; $i < $length; ++$i) {
        $pieces []= $keyspace[random_int(0, $max)];
    }
    return implode('', $pieces);
}

用法

$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');
$c = random_str();

演示https ://3v4l.org/IMJGF(忽略 PHP 5 失败; 它需要 random_compat)

这将创建一个 20 个字符长的十六进制字符串:

$string = bin2hex(openssl_random_pseudo_bytes(10)); // 20 chars

在 PHP 7( random_bytes() )中:

$string = base64_encode(random_bytes(10)); // ~14 characters, includes /=+
// or
$string = substr(str_replace(['+', '/', '='], '', base64_encode(random_bytes(32))), 0, 32); // 32 characters, without /=+
// or
$string = bin2hex(random_bytes(10)); // 20 characters, only 0-9a-f

@tasmaniski:您的回答对我有用。我遇到了同样的问题,对于那些一直在寻找相同答案的人,我建议这样做。这里是 @tasmaniski:

<?php 
    $random = substr(md5(mt_rand()), 0, 7);
    echo $random;
?>

这是一个youtube 视频,向我们展示了如何创建随机数

根据您的应用程序(我想生成密码),您可以使用

$string = base64_encode(openssl_random_pseudo_bytes(30));

它们是 base64,可能包含=-以及所请求的字符。您可以生成更长的字符串,然后对其进行过滤和修剪以将其删除。

openssl_random_pseudo_bytes似乎是在 php 中生成适当随机数的推荐方法。为什么rand不使用/dev/random我不知道。

这是一个简单的单行代码,它可以生成真正的随机字符串,而无需任何脚本级循环或使用 OpenSSL 库。

echo substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', mt_rand(1,10))), 1, 10);

进行分解以使参数清晰

// Character List to Pick from
$chrList = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

// Minimum/Maximum times to repeat character List to seed from
$chrRepeatMin = 1; // Minimum times to repeat the seed string
$chrRepeatMax = 10; // Maximum times to repeat the seed string

// Length of Random String returned
$chrRandomLength = 10;

// The ONE LINE random command with the above variables.
echo substr(str_shuffle(str_repeat($chrList, mt_rand($chrRepeatMin,$chrRepeatMax))), 1, $chrRandomLength);

此方法的工作原理是随机重复字符列表,然后重新组合字符串,然后返回指定的字符数。

您可以通过将返回的字符串的长度随机化来进一步将其随机化,将$chrRandomLength替换$chrRandomLength mt_rand(8, 15) $chrRandomLength mt_rand(8, 15) (对于 8 到 15 个字符的随机字符串)。

function generateRandomString($length = 15)
{
    return substr(sha1(rand()), 0, $length);
}

多田!

实现此功能的更好方法是:

function RandomString($length) {
    $keys = array_merge(range(0,9), range('a', 'z'));

    $key = "";
    for($i=0; $i < $length; $i++) {
        $key .= $keys[mt_rand(0, count($keys) - 1)];
    }
    return $key;
}

echo RandomString(20);

mt_rand根据是更随机这个这个在 PHP 7. rand函数是一个别名mt_rand

函数范围中的$randstring与调用它的范围不同。您必须将返回值分配给变量。

$randstring = RandomString();
echo $randstring;

或者直接回显返回值:

echo RandomString();

另外,在您的功能中,您会犯一些小错误。在 for 循环中,您需要使用.=以便每个字符都附加到字符串中。通过使用=您将用每个新字符覆盖它,而不是附加字符。

$randstring .= $characters[rand(0, strlen($characters))];