在PHP中生成快速伪随机数据

时间:2010-08-30 12:49:50

标签: php random

我需要生成不可压缩的数据(因此伪随机),并且一直尝试使用下面的代码。但它只产生大约10MB / s的数据。我需要大约100-200 MB / s。 你有什么建议吗?

if ($length > 8*1024*1024){ //Default max string length in php.
    while (($length - $bytesGenerated)>8*1024*1024){
        $bytesGenerated = $bytesGenerated + (8*1024*1024);
        print(openssl_random_pseudo_bytes(8*1024*1024));
    }
}
print(openssl_random_pseudo_bytes($length - $bytesGenerated));

4 个答案:

答案 0 :(得分:5)

如果你在linux下工作,你可以从/ dev / urandom读取它的内核快速伪随机生成器。

另一方面你可以使用openssl rand和pipe进入php。

答案 1 :(得分:4)

您需要加密安全的伪随机数吗?否则你可以尝试实现一个 Linear feedback shift register

答案 2 :(得分:2)

即使使用加速器,这对PHP也很难。 我会专门为这个特性编写C ++模块(但即使在C ++上也不是很容易)。

答案 3 :(得分:1)

在3GHz CPU(x86)上达到峰值理论最大性能时,如果您尝试达到200MB / s,则每个随机字节的预算不到4个CPU指令。真实世界的表现将远远低于此。我认为这在任何语言中都会非常困难。你很熟悉那些倾向于使用专用硬件加速器的速度(即你试图每秒1.56Gbit)。在网络或视频应用中,有相当数量的外部硬件专用于允许这种吞吐量。 C或程序集中的一个非常有效的实现可能允许你达到这个约束,但是你真的只能使用通用硬件来达到极限。

我会考虑预先生成数据(如已经建议的那样)或使用某种硬件加密加速器来击中类似这些吞吐量的任何东西。我找到了list of crypto accelerator hardware vendors

作为最后的想法,你实际上每秒意味着200兆字节,对吧?如果你的意思是超级那么这个问题就更容易解决了。