PHP随机字符串生成器


814

我正在尝试在PHP中创建一个随机字符串,并且我对此绝对没有输出:

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

    RandomString();
    echo $randstring;

我究竟做错了什么?


241
我生成短字符串的单行解决方案是substr(md5(rand()),0,7); 祝你好运……
tasmaniski 2012年

5
@tasmaniski ..您的解决方案还可以..但随机性较低!在您的示例中,可以生成的随机字符串的数量受整数大小限制。(2 ^ 32)最大。在其他解决方案的情况下,您可以生成(62 ^ 8)。其他解决方案则增加到(62 ^ n)
。– Manu

9
您忘记将每个新生成的字符添加到字符串中。您只是按原样覆盖它。应该是$ randstring。= $ characters ..
Spock

3
@CaptainLightning您能否将接受的答案换成更安全的答案之一?:)
Scott Arciszewski 2015年

2
strlen($characters)=> strlen($characters) - 1-字符串长度以1
Zippp '17

Answers:


1393

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

  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();

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


34
@FranciscoPresencia,最好在循环的比较条件下“浪费”一个额外的变量,就像在调用一个方法一样。
Rico Sonntag

200
所有的工作,为什么不只是这样substr(str_shuffle(MD5(microtime())), 0, 10);
SpYk3HH 2014年

4
感谢您提供的代码,但请更改rand()mt_rand()。我用你的方法和经历与名称的冲突。
Nate 2014年

5
@FranciscoPresencia你知道这在效率上是多么低下吗?您每次迭代都要检查字符串的长度两次!在进入循环之前,循环内部的strlen也应缓存在变量中。
developerbmw

4
这不是一个好的解决方案。生成的字符串将是可预测的。:(
Scott Arciszewski 2015年

370

注意: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)

而已。:)


64
+1为最短答案:)。但是并不是每个用例的最佳答案。此代码将输出字符串,其中每个字符不会出现多次(因此使其在蛮力攻击下变弱),并且不会输出超过62个字符的内容。
大卫

17
不要这样做,这是非常薄弱的​​。输入随机字符串的时间越长,它的强度就越弱。
Abhi Beckert

23
可能很弱,但是它又快速又容易。取决于用例,这很好-我使用了它是因为我不需要安全性或强度。只是快速射击。我正在编写一个单元测试,这给了我适当的随机输入以进行测试。
SDC 2013年

23
@FranciscoPresencia不安全的原因是因为它从未两次使用相同的字符。这使它成为可怕的密码生成器。请大家停止投票,这绝对是不安全的,绝对不能使用。随着密码变长,必须用蛮力测试的字符数也变短,因为您不必费心测试任何以前使用的字符。
阿披·贝克特

8
@FranciscoPresencia:我支持您关于避免将其用于随机密码的评论。但是,我不同意这个答案不应该加一。我对此选项加了一个,因为它是生成随机字符串的有效单行解决方案(此问题的原始主题)。
bwright 2013年

331

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

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

对于那些坚持发明自己的解决方案的人,PHP 7.0.0将random_int()为此目的提供;如果您仍在使用PHP 5.x,我们为该应用程序random_int()编写了PHP 5 polyfill,因此即使您升级到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)


3
在函数的开头添加$keyspace = str_shuffle($keyspace );更多安全性
Jevgenij Dmitrijev '17

13
“提高安全性”是什么意思?我们已经在使用安全的随机数生成器。
Scott Arciszewski

5
@JGEstiot创建安全的随机字符串需要加密的安全随机性。一个安全的答案比不安全的答案更好地为搜索“如何在PHP中生成随机字符串”的人提供服务。
Scott Arciszewski '18

1
@ Scott Arciszewski您不必每次创建随机字符串时都创建密码随机字符串。问题是关于创建随机字符串,这与安全性无关。您假定该字符串将在安全敏感的上下文中使用,并且添加了一层复杂性,阻止了问题的核心。
JG Estiot '18

45
为开发人员使用random_int()代替rand()或不mt_rand()增加复杂性。同时,它为他们提供了更高的安全性。来StackOverflow寻找快速解决方案的人们可能不知道他们正在建造的东西是否需要安全。如果我们为他们提供默认的安全答案,即使从他们的角度来看这完全是偶然的,他们也会创建更安全的Internet。为什么您反对这个目标对我来说还是个谜。
Scott Arciszewski '18

155

这将创建一个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

请注意,openssl_random_pseudo_bytes()直到php 5.6才使用加密功能强的算法。相关错误:bugs.php.net/bug.php?id = 70014
acidtv

还要注意,此字符串可以使长度最小的字符串为2。如果将长度小于或等于1的字节传递给openssl_random_pseudo_bytes()您,那么您将一无所获。此外,请注意,当使用bin2hex(openssl_random_pseudo_bytes($length / 2)),因为你与整数工作,它会自动删除模,并且将使用2。所以下一个最小倍数,$length = 19会产生长度18的字符串
弥敦道F.

建议将其用作可以通过打开的文件内容,fgets($fp, 1024)以及每个文件编辑器都出现长行问题:function string_rand($len, $split="\n") { return substr(chunk_split(bin2hex(openssl_random_pseudo_bytes(ceil($len / 2))), 1023, $split), 0, $len); }将其设置$splitnull是否应返回单线。这样,您就可以在两种情况下使用它。
mgutt

我真的很喜欢PHP 7的random_bytes解决方案,但是如果您需要将字符串设置为一定数量的字符,是否可以执行此操作?$string = substr(base64_encode(random_bytes($size)), 0, $size);
Programster

毫无疑问,这绝对是最佳解决方案。占用空间很小,而且超级易于理解。
马修·坎贝尔

92

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

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

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


6
如果您的字符串仅基于随机整数,为什么不只使用随机整数?他们通过对哈希进行哈希处理并没有得到更深的了解……并且通过减少哈希值实际上消除了开始时需要的一点熵。
Surrican 2014年

4
切记,md5字符数限制为30个字符,并且始终为小写字符。
fyrye 2014年

3
此外,rand()不应用于加密。如果您想生成一个加密的声音字符串,请使用openssl_random_pseudo_bytes
mattkgross 2015年

md5(rand())仅提供2 ^ 32个可能的值。这意味着在平均2 ^ 16个随机字符串之后,您将希望重复一次。
Scott Arciszewski 2015年

2
好吧..我敢打赌,OP不会在谈论“安全随机字符串”。对于正确的用例,该解决方案紧凑,容易且易于记忆。而且,如果您需要照顾可能的冲突,为什么不给随机字符串加上时间戳呢?:)
Erenor Paz

46

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

$string = base64_encode(openssl_random_pseudo_bytes(30));

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

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


2
rand不使用/ dev / urandom,因为它仅在posix之类的环境中可用并且不可移植。
MacroMan 2014年

3
@MacroMan但是openssl_random_pseudo_bytes() 移植。
杰克


3
这没错,但是我建议您谨慎丢弃不想要的字符。例如,请参见PHP联盟的OAuth2服务器上的拉取请求
Scott Arciszewski 2015年

这是最好的答案之一。可惜它没有更多的支持。我建议编辑您的答案,以便更好地处理不需要的字符。
jcuenod

28

这是一个简单的单行代码,它可以生成真正的随机字符串,而无需任何脚本级循环或使用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);

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

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


遗憾的是,但是当选择了一个角色时,其再次出现的可能性不如仍保留在池中的其他角色那么高。这里没有真正的随机性……
Surrican 2014年

@TheSurrican-您在该语句中将不正确。使用此算法,所有字符具有相等的概率,因此实际上是随机的。这是通过重复chrList字符串$ chrRepeatMax来确保的,魔术确实发生在str_shuffle中,它确定了随机性。
Kraang Prime 2015年

所有字符只会出现一次,很容易出现暴力猜测
venimus

@venimus那是不正确的。该char字符串可以重复复制任意数量的字符(请参阅$chrRepeatMax$chrRepeatMin),因此10个char字符串可以(不太可能,但是可能)为“ aaaaaaaaaa”。
Kraang Prime

@SanuelJackson对不起,我错过了评论。我把评论放在错误的答案上。你是对的!我实际上使用了您的“技巧”,但没有使用mt_rand,因为它是没用的恕我直言。它不会增加熵。刚刚使用const和max-length。
venimus 2015年

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

多田!


请注意sha1,字符数限制为40个字符,并且始终为小写字符。
fyrye 2014年

3
sha1字符串不是随机的,某些字符会比其他字符更频繁地出现。在您确实希望随机性(例如密码)的情况下使用此方法是不明智的。
Kit Sunde 2014年

1
@KitSunde-是的,sha不是随机的,rand()是随机的。对于这里需要的东西,sha非常好。OP不需要加密级别的随机性。
达沃2015年

@davor rant()随机分布与sha没有均匀分布无关紧要。如果从不均匀分布中随机选择,则会得到完全相同的不均匀分布。我要强调的不是“加密级别”的随机性,如果是这种情况,则不应使用rand()任何一种。像接受的答案一样,只需最少的努力即可从均匀分布中进行抽取,并且与rand()一样随机,这是合理的。
Kit Sunde 2015年

@KitSunde-最终实际上没有任何区别。那就是过度工程和镀金的定义。
达沃2015年

24

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

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


1
注意:mt_rand不会生成加密安全值。为此,您应该使用PHP7 random_intrandom_bytes
jchook

18

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

$randstring = RandomString();
echo $randstring;

或者直接回显返回值:

echo RandomString();

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

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

14

首先,定义要使用的字母:

$alphanum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$special  = '~!@#$%^&*(){}[],./?';
$alphabet = $alphanum . $special;

然后,使用openssl_random_pseudo_bytes()生成适当的随机数据:

$len = 12; // length of password
$random = openssl_random_pseudo_bytes($len);

最后,您使用此随机数据创建密码。因为其中的每个字符都$random可以是chr(0)直到chr(255),所以代码使用其序数值除以后的余数,$alphabet_length以确保仅从字母表中选取字符(请注意,这样做会使随机性产生偏差):

$alphabet_length = strlen($alphabet);
$password = '';
for ($i = 0; $i < $len; ++$i) {
    $password .= $alphabet[ord($random[$i]) % $alphabet_length];
}

另外,通常更好的方法是使用RandomLibSecurityLib

use SecurityLib\Strength;

$factory = new RandomLib\Factory;
$generator = $factory->getGenerator(new Strength(Strength::MEDIUM));

$password = $generator->generateString(12, $alphabet);

使用模运算符%将产生偏置输出。但是,RandomLib的强+1。不要重新发明轮子。
Scott Arciszewski 2015年

1
是的,新的random_int()函数是好的:d
杰克

11

简短方法

这是生成随机字符串的最短方法

<?php
echo $my_rand_strng = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), -15); 

echo substr(md5(rand()), 0, 7);

echo str_shuffle(MD5(microtime()));
?>

10

我已经测试了大多数常用功能的性能,在我的盒子上生成1'000'000 32个符号的字符串所需的时间是:

2.5 $s = substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,32);
1.9 $s = base64_encode(openssl_random_pseudo_bytes(24));
1.68 $s = bin2hex(openssl_random_pseudo_bytes(16));
0.63 $s = base64_encode(random_bytes(24));
0.62 $s = bin2hex(random_bytes(16));
0.37 $s = substr(md5(rand()), 0, 32);
0.37 $s = substr(md5(mt_rand()), 0, 32);

请注意,它到底有多长时间并不重要,但是哪一个速度较慢而哪一个速度较快,因此您可以根据自己的要求进行选择,包括加密就绪性等。

如果需要小于32个符号的字符串,则为了精确起见,在MD5周围添加了substr()。

为了回答这个问题:该字符串未连接但被覆盖,并且函数的结果未存储。


我认为,这是最好的答案。谢谢!
NSukonny,

10

PHP 7+使用random_bytes函数生成加密安全的随机字节。

$bytes = random_bytes(16);
echo bin2hex($bytes);

可能的输出

da821217e61e33ed4b2dd96f8439056c


PHP 5.3+使用openssl_random_pseudo_bytes函数生成伪随机字节。

$bytes = openssl_random_pseudo_bytes(16);
echo bin2hex($bytes);

可能的输出

e2d1254506fbb6cd842cd640333214ad


最好的情况下,使用

function getRandomBytes($length = 16)
{
    if (function_exists('random_bytes')) {
        $bytes = random_bytes($length / 2);
    } else {
        $bytes = openssl_random_pseudo_bytes($length / 2);
    }
    return bin2hex($bytes);
}
echo getRandomBytes();

可能的输出

ba8cc342bdf91143


这不会生成具有给定长度的字符串
Timberman

@Timberman它将立即生成确切的长度。
Madan Sapkota

9

一种非常快速的方法是执行以下操作:

substr(md5(rand()),0,10);

这将生成一个长度为10个字符的随机字符串。当然,有些人可能会说它在计算方面更加繁琐,但是如今,处理器已经过优化,可以非常快速地运行md5或sha256算法。当然,如果rand()函数返回相同的值,则结果将是相同的,即有1/32767相同的机会。如果安全是问题所在,则只需更改rand()mt_rand()


7
function rndStr($len = 64) {
     $randomData = file_get_contents('/dev/urandom', false, null, 0, $len) . uniqid(mt_rand(), true);
     $str = substr(str_replace(array('/','=','+'),'', base64_encode($randomData)),0,$len);
    return $str;
}

4
这不是便携式的。如果尝试在任何非posix环境中运行此命令,则将导致致命错误。
Bryan Agee 2014年

7

这是从管理员来源获得的

/** Get a random string
* @return string 32 hexadecimal characters
*/
function rand_string() {
    return md5(uniqid(mt_rand(), true));
}

Adminer,用PHP编写的数据库管理工具。


6

Laravel 5框架的辅助函数

/**
 * Generate a "random" alpha-numeric string.
 *
 * Should not be considered sufficient for cryptography, etc.
 *
 * @param  int  $length
 * @return string
 */
function str_random($length = 16)
{
    $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    return substr(str_shuffle(str_repeat($pool, $length)), 0, $length);
}

4
“不应被认为足以进行密码学等。” 应该大力强调这一点。
Scott Arciszewski 2015年


4

该函数的编辑版本可以正常工作,但是我发现只有一个问题:您使用了错误的字符来包围$字符,因此'字符有时是所生成的随机字符串的一部分。

要解决此问题,请更改:

$characters = 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;

至:

$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

这样,仅使用封闭的字符,而'字符将永远不会成为所生成的随机字符串的一部分。


4

另一个单行代码,它生成一个由10个字符组成的随机字符串,其中包含字母和数字。它将使用创建一个数组range(调整第二个参数以设置大小),在该数组上循环并分配一个随机ASCII字符(范围为0-9或az),然后内插该数组以获取字符串。

$str = implode('', array_map(function () { return chr(rand(0, 1) ? rand(48, 57) : rand(97, 122)); }, range(0, 9)));

注意:这仅在PHP 5.3及更高版本中有效


最终是一个真正的随机解决方案,而不是32位随机整数或经过改组的字符串的hash肿散列……
Surrican 2014年

仅有一个问题:数字与字符的发生可能性一样,这不像我希望的那样随机。任意+1,以获取此页面上的最佳解决方案。调整它及其完美。
Surrican 2014年

调整...像这样吗?rand(0, 57-48+122-97)<57-48?...:...?:)
vp_arth

4

一支班轮。

对于具有某些唯一性的大型字符串来说,这是快速的。

function random_string($length){
    return substr(str_repeat(md5(rand()), ceil($length/32)), 0, $length);
}

md5(rand())是生成随机数的极其不安全的方法。
Scott Arciszewski 2015年

1
目的是具有X长度和某些唯一性的字符串。真正的随机性不是目的。
雅各布·史密斯


3

我喜欢最后一个使用openssl_random_pseudo_bytes的注释,但这对我来说不是一个解决方案,因为我仍然不得不删除不需要的字符,而且我无法获得设置长度的字符串。这是我的解决方案...

function rndStr($len = 20) {
    $rnd='';
    for($i=0;$i<$len;$i++) {
        do {
            $byte = openssl_random_pseudo_bytes(1);
            $asc = chr(base_convert(substr(bin2hex($byte),0,2),16,10));
        } while(!ctype_alnum($asc));
        $rnd .= $asc;
    }
    return $rnd;
}

3
function randomString($length = 5) {
    return substr(str_shuffle(implode(array_merge(range('A','Z'), range('a','z'), range(0,9)))), 0, $length);
}

3

这是我简单的单行解决方案,用于生成使用友好的随机密码,排除类似“ 1”和“ l”,“ O”和“ 0”等类似的字符……这里是5个字符,但是您可以轻松地当然改变它:

$user_password = substr(str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789'),0,5);

这是创建随机ID字符串以稍后在jquery上调用的完美选择。IDK,如果它的良好做法,但这对我很有帮助,而无需使用公认的答案……
Rodrigo Zuluaga

3

这是另一种解决方案。

function genRandomString($length = 10)
{
    if($length < 1)
        $length = 1;
    return substr(preg_replace("/[^A-Za-z0-9]/", '', base64_encode(openssl_random_pseudo_bytes($length * 2))), 0, $length);
}

PS。我在Ubuntu上使用PHP 7.2。


2

PHP中生成随机字符串的另一种方法是:

function RandomString($length) {
    $original_string = array_merge(range(0,9), range('a','z'), range('A', 'Z'));
    $original_string = implode("", $original_string);
    return substr(str_shuffle($original_string), 0, $length);
}
echo RandomString(6);

2

这是我要获取真正的唯一随机密钥的方法:

$Length = 10;
$RandomString = substr(str_shuffle(md5(time())), 0, $Length);
echo $RandomString;

您可以使用time(),因为它是Unix时间戳,并且与上述其他随机变量相比始终是唯一的。然后,您可以生成该值的md5sum,并从生成的MD5中获取所需的长度字符串中。在这种情况下,我使用10个字符,并且如果我想使其更独特,则可以使用更长的字符串。

我希望这有帮助。


2
当然,time()它远非唯一:它将一次又一次返回相同的值,直到当前秒结束为止。这里真正提供一些随机性的是str_shuffle()-其余代码仅减少了从中选择字符的示例。
阿尔瓦罗·冈萨雷斯

1
因此,您基本上要做的是将32位整数改组。这里没有很多熵……
Surrican 2014年

2
攻击者可以猜测返回的值time()(仅是时间戳),这是随机性的弱源。
AL

2

PHP 5.1.0开始工作,仅使用PHP本机函数进行参数化的单行代码

str_shuffle(implode('', (array_intersect_key(($map =  array_map('chr', array_merge(array_map('mt_rand', array_fill(0, $length = 25, 48), array_fill(0,$length,57)),array_map('mt_rand', array_fill(0, $length, 65), array_fill(0,$length,90)),array_map('mt_rand', array_fill(0, $length, 97), array_fill(0,$length,122))))), array_flip($keys = array_rand($map, $length))))))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.