<?php
function RandomString()
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randstring = '';
for ($i = 0; $i < 10; $i++) {
$randstring = $characters[rand(0, strlen($characters))];
}
return $randstring;
}
RandomString();
echo $randstring;
具体地回答这个问题,有两个问题:
$randstring
不在范围内。 这是包含更正的代码段:
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;
?>
根据您的应用程序(我想生成密码),您可以使用
$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);
}
多田!
函数范围中的$randstring
与调用它的范围不同。您必须将返回值分配给变量。
$randstring = RandomString();
echo $randstring;
或者直接回显返回值:
echo RandomString();
另外,在您的功能中,您会犯一些小错误。在 for 循环中,您需要使用.=
以便每个字符都附加到字符串中。通过使用=
您将用每个新字符覆盖它,而不是附加字符。
$randstring .= $characters[rand(0, strlen($characters))];