2010-08-30 8 views
7

Necesito generar datos no comprimibles (por lo tanto, pseudoaleatorios), y he intentado con el código siguiente. Pero solo produce unos 10 MB/s de datos. Necesito unos 100-200 MB/s. ¿Tiene algún consejo?Generar datos pseudoaleatorios rápidos en PHP

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

¿Puedo preguntar por qué necesita tantos datos aleatorios que se generan sobre la marcha (como por qué no puede pregenerarlo y luego transmitirlo)? – ircmaxell

Respuesta

5

si está trabajando en Linux que sólo se podía leer desde/dev/urandom, sus núcleos generador pseudoaleatorio rápido.

Por otro lado, podría usar el rand de openssl y conectarlo a php.

+0

¿Seguro que puede darte 200Mb/seg? Voto por 10-20Mv/seg como máximo) – BarsMonster

+0

En cuanto a la velocidad de/dev/urandom un Google rápido me dice que debería esperar al menos 20MB/s –

+0

Google me dijo que es 3.5Mb/seg :-) dd if =/dev/urandom de = foo bs = cuenta 1M = 100000 100000 + 0 registros en 100000 + 0 registros 104857600000 bytes (105 GB) copiados, 30104.4 s, 3.5 MB/s – BarsMonster

2

Eso será difícil para PHP, incluso con aceleradores. Escribo el módulo C++ específicamente para esa característica (pero incluso en C++ no es muy fácil).

4

¿Necesita números pseudoaleatorios seguros de cifrado? De lo contrario podría tratar de poner en práctica un Linear feedback shift register

+1

Usaría "alta calidad" en lugar de "real" en este contexto: intente definir cuándo un flujo desordenado es "realmente" pseudoaleatorio ... Pero si la generación en tiempo real es un requisito, pregunte si realmente necesita un flujo de calidad criptográfica. Crappy y rápido puede ser el camino a seguir ... – dmckee

+0

Tienes razón, por supuesto. – Silfverstrom

+1

No hay forma de que la implementación PHP dé 200Mb/seg. Simplemente imposible, hasta que PHP muestre el compilador JIT :-) – BarsMonster

1

En el pico de rendimiento máximo teórico en un 3 GHz CPU (x86), que tendría un presupuesto de poco menos de 4 instrucciones de la CPU por byte al azar, si estuviera tratando de golpear 200 MB/s . El rendimiento en el mundo real será considerablemente menor que esto. Posicionaría que esto será extremadamente difícil en cualquier idioma. Estás muy metido en el tipo de velocidades que suelen emplear un acelerador de hardware dedicado (es decir, estás intentando hacer 1.56 Gbit por segundo). En aplicaciones de red o video, hay una cantidad considerable de hardware externo dedicado a permitir este tipo de rendimiento. Una implementación extremadamente eficiente en C o en el ensamblaje podría permitirle alcanzar esta restricción, pero en realidad está llegando al límite de lo que es posible solo con hardware de uso general.

Consideraría pregenerar los datos (como ya se ha sugerido) o emplear algún tipo de criptoacelerador de hardware para alcanzar cualquier cosa que se parezca a este tipo de rendimiento. Encontré esto list of crypto accelerator hardware vendors.

Como reflexión final, de hecho significó 200 mega bytes por segundo, ¿verdad? Si se refería a mega bits, entonces este problema es mucho más fácil de resolver.

+0

Las cantidades son considerables, pero la velocidad es esencial. Una solución en caché estaría bien. /dev/urandom @ ~ 20MB/s va a estar bien por el momento. Una CPU 4core x64 aliviaría los problemas de rendimiento en bruto, sin embargo, el sistema se tensará (si es posible). (bytes previstos) –

Cuestiones relacionadas