Php 统计随机密码生成器的可能唯一值

Php 统计随机密码生成器的可能唯一值,php,Php,我正在尝试创建随机密码,方法如下: function givemepass() { $pass = ''; for ($i = 0; $i < 4; $i++) { $abc = str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); $x = mt_rand(0, 35); $pass .= substr($abc, $x, 1); } return $pas

我正在尝试创建随机密码,方法如下:

function givemepass() {
    $pass = '';
    for ($i = 0; $i < 4; $i++) {
        $abc = str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
        $x = mt_rand(0, 35);
        $pass .= substr($abc, $x, 1);
    }
    return $pass;
}
函数givemepass(){
$pass='';
对于($i=0;$i<4;$i++){
$abc=str_shuffle(“abcdefghijklmnopqrstuvxyz012456789”);
$x=百万兰特(0,35);
$pass.=substr($abc,$x,1);
}
返回$pass;
}
我很感兴趣的是,使用上述代码,
$pass
有多少唯一值是可能的

我不需要所有值的列表,只需要计数


有什么想法吗?

每个字符可以是36种可能性中的一种。对于这些字符中的每一个,下一个字符可以是36种可能性中的1种

因此,使用4个字符密码的可能性总数为
36*36*36*36

您可以通过以下方式简化代码:

$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$pass = '';
foreach(range(1,4) as $i) $pass .= $chars[mt_rand(0,35)];
您的代码将运行得更快,因为您不会每次都洗牌字符


PS:这适用于一个简单的应用程序。但是,如果您需要加密安全算法,请不要使用
md\u rand
,也不要将密码限制为4个字符

您正在生成一个包含4个字符的密码,其中每个字符有36种可能。这就产生了36^4或1.679.616的可能性

此外,我想指出,
mt_rand
不是生成密码的安全方法:

此函数不生成加密安全值,不应用于加密目的。如果需要加密的安全值,请考虑使用RealthyIn()、RealthyByTeSe()、或OpenSSLIVRAPIONPIDOOYBYTESE()来代替。
许多随机生成器,如
mt_rand
,会生成可预测的随机数(这也是为什么他们称之为伪随机数生成器或PRNG),这意味着,如果一个人可以获得一行中的几个密码,他们可以计算分配给其他用户的所有下一个和所有以前的密码。您另外调用
str_shuffle
这一事实让它变得有点困难,但是…

如果我理解正确,您可能会受益于我在这里提出的一个问题的评论中的逻辑-我认为最后一句可能夸大了
mt_rand
(建议只给出一个输出,就可以计算出所有以前和以后的输出)但是,
mt_rand
在这里只是一个随机排列无序字符串序列的工具。我想这是无法预测的。
str_shuffle
也是基于相同的Mersenne Twister PRNG,所以也是可以预测的,但是因为你将两者结合在一起,所以反向工程就有点困难了。但是如果一个人可以连续获得几个密码,那么e rest是可以计算出来的。所以如果
mt_rand
是可预测的,如果
shuffle
是可预测的-什么是
不可预测的
?@在这种情况下,它是
mt_rand
str_shuffle
的组合,但是在你的回答中,只使用
mt_rand
,每个密码会得到4个随机数直接按顺序排列,
mt_rand
,不要将其限制为仅包含字母数字字符。