0

我需要生成伪随机代码供人们用来访问我的网站。我编写了一些代码来实现这一点,但没有意识到我使用字符数组而不是整数作为种子(使 mt_rand 可重复)。我的演示代码在这里:

$seedVal = array(6565866669, 6565866670, 6565866671);


foreach ($seedVal as $seed) {
    mt_srand($seed);
    $rnd = '';
    for ($i = 0; $i < 11; $i++) { // Loop over the string length
        $tmp = mt_rand(0, 10);
        $rnd .= $tmp;
    }

    echo "Seed = $seed, RandNum = $rnd </br>";
}

echo "</br>Now with character seeds</br>";

$seedVal = array('6565866669', '6565866670', '6565866671');

foreach ($seedVal as $seed) {
    mt_srand($seed);
    $rnd = '';
    for ($i = 0; $i < 11; $i++) { // Loop over the string length
        $tmp = mt_rand(0, 10);
        $rnd .= $tmp;
    }

    echo "Seed = $seed, RandNum = $rnd </br>";
}

return;

1and1 的结果是:

Seed = 6565866669, RandNum = 425453109319 
Seed = 6565866670, RandNum = 39388593858 
Seed = 6565866671, RandNum = 891273965110 

Now with character seeds
Seed = 6565866669, RandNum = 97138956767 
Seed = 6565866670, RandNum = 97138956767 
Seed = 6565866671, RandNum = 97138956767 

但在其他任何地方,结果(本地主机、其他服务器等)是:

Seed = 6565866669, RandNum = 425453109319
Seed = 6565866670, RandNum = 39388593858
Seed = 6565866671, RandNum = 891273965110

Now with character seeds
Seed = 6565866669, RandNum = 425453109319
Seed = 6565866670, RandNum = 39388593858
Seed = 6565866671, RandNum = 891273965110 

问题是在我目前的服务器(1and1)上,系统工作正常(使用不可预测的字符输入)。但是我正在迁移到新服务器,当然,代码看起来总是像第一组一样。换句话说,我不知道如何生成第二组随机数(以字符数组为种子)。

谁能告诉我该怎么做?

我想:

mt_srand('6565866669');
echo mt_rand(0, 10);

返回

97138956767

挣扎。谢谢!!

4

1 回答 1

4

(来自这里的信用已经确定了问题:你有一个 32 位和一个 64 位服务器。如果他发布它,请接受他的回答)

这是你的问题:

  1. mt_srand() 接受一个整数参数
  2. 当参数需要时,PHP 将(有帮助地)尝试将您的字符串转换为整数
  3. 64 位系统上的最大整数是 4.something gazillion - 所以你的字符串将转换为整数,但在 32 位系统上,最大整数是 21 亿,所以你的字符串将转换为允许范围内的不同整数(它去到 21 亿,然后换行到 -21 亿并计数并重复)。

处理 big_ints 的解决方案是使用 GMP 或 BCMath 库,但在这种情况下,这些库将不起作用,因为 mt_srand() 需要一个整数 - 所以你被限制在 -21 亿和 +21 亿之间的数字,或者安装 64 位您的 Web 服务器上的 OS/Apache/PHP。

于 2012-09-14T02:05:53.320 回答