Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Graphixx en 22 Enero 2015, 23:12 pm



Título: [Ayuda] problema con libreria que genera string aleatorio
Publicado por: Graphixx en 22 Enero 2015, 23:12 pm
Tengo un script de generacion aleatoria de strings, que funciona perfecto en el xampp del portatil, pero en el xampp de la torre no.
Alguna idea de por que siendo la misma instalacion de xampp, el script funciona mal en la torre.
(http://imagizer.imageshack.us/v2/280x200q90/540/ystkNe.png) (https://imageshack.com/i/f0ystkNep)

Código
  1. <?php
  2. ini_set('max_execution_time', 0);
  3.  
  4. function RandomString($length=10,$uc=TRUE,$n=TRUE,$sc=FALSE)
  5. {
  6.    $source = 'abcdefghijklmnopqrstuvwxyz';
  7.    //if($uc==1) $source .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  8. if($uc==1) $source .= 'abcdefghijklmnopqrstuvwxyz';
  9.    if($n==1) $source .= '1234567890';
  10.    //if($sc==1) $source .= '|@#~$%()=^*+[]{}-_';
  11.    if($length>0){
  12.        $rstr = "";
  13.        $source = str_split($source,1);
  14.        for($i=1; $i<=$length; $i++){
  15.            mt_srand((double)microtime() * 1000000);
  16.            $num = mt_rand(1,count($source));
  17.            $rstr .= $source[$num-1];
  18.        }
  19.  
  20.    }
  21.    return $rstr;
  22. }
  23.  
  24. $link=mysql_connect("localhost","root","");
  25. mysql_select_db("seriales",$link);
  26.  
  27. require_once 'Serial.php';
  28. for ($i = 0; $i < 100; $i++) {
  29.  
  30.    $cod1 = RandomString(6,TRUE,true,false);
  31.  
  32. $inputString = addslashes(strip_tags($cod1));
  33. $inputLength = (int)4;
  34. $serial = new Serial($inputLength);
  35. $serialString = $serial->generate($inputString);
  36.  
  37.    mysql_query("insert into seriales(qr,serial) values('$cod1','$serialString')",$link);
  38. }
  39. mysql_close($link);
  40. ?>
  41.  

En el portatil los string se generan bien, y sale un codigo aleatorio de 6 cifras. Pero cuando lo ejecuto en la torre, pasando el script directamente del portatil a la torre sin tocar nada, el string se queda como que pegado en la primer cifra, no logro entender por que.


Título: Re: [Ayuda] problema con libreria que genera string aleatorio
Publicado por: MinusFour en 23 Enero 2015, 00:59 am
Comenta la linea del srand o prueba con:

Código
  1. mt_srand((double)microtime(true) * 1000000);

Edit: Y muevela fuera del for.


Título: Re: [Ayuda] problema con libreria que genera string aleatorio
Publicado por: Graphixx en 25 Enero 2015, 03:45 am
Edit: Y muevela fuera del for.

Antes o despues del for ?  :xD


Título: Re: [Ayuda] problema con libreria que genera string aleatorio
Publicado por: MinusFour en 25 Enero 2015, 04:00 am
Antes o despues del for ?  :xD

Debe ser antes.


Título: Re: [Ayuda] problema con libreria que genera string aleatorio
Publicado por: #!drvy en 25 Enero 2015, 21:46 pm
Yo el mt_srand lo veo bien ahí, así genera una nueva semilla por cada iteración. Estas seguro de que son las mismas versiones de XAMPP ?  Y en donde se queda pegado, en la propia función de RandomString o en el for que genera el serial ? No te da ningún error (teniendo display_errors on) ?

Saludos


Título: Re: [Ayuda] problema con libreria que genera string aleatorio
Publicado por: MinusFour en 26 Enero 2015, 01:17 am
Yo el mt_srand lo veo bien ahí, así genera una nueva semilla por cada iteración. Estas seguro de que son las mismas versiones de XAMPP ?  Y en donde se queda pegado, en la propia función de RandomString o en el for que genera el serial ? No te da ningún error (teniendo display_errors on) ?

Saludos

Realmente no necesitas generar la semilla nuevamente, al generar el numero aleatorio la semilla vuelve a cambiar, por eso solo debería generar la semilla una vez al principio (a menos que este usando la funcion para otra cosa).

Lo que creo que esta pasando aqui es que mt_srand al recibir de parametro un entero, esta truncando los decimales (tecnicamente el unico parametro que recibe la funcion es entero).


Código
  1. <?php
  2.  
  3. mt_srand(10000.20);
  4. echo mt_rand().PHP_EOL;
  5.  
  6. mt_srand(10000.89);
  7. echo mt_rand().PHP_EOL;
  8.  

Código:
╭─m1n054@ALEXPC ~/d/php
╰─ ❯❯❯ php ex1.php
983171632
983171632

Aun así no estoy seguro de porque en una de sus maquinas funciona y en el otro no. Debe ser un error de casting ya sea de doble a entero o de string a double.

Creo que mejor aun sería utilizar el código de la pagina de PHP:

Código
  1. function make_seed()
  2. {
  3.  list($usec, $sec) = explode(' ', microtime());
  4.  return (float) $sec + ((float) $usec * 100000);
  5. }
  6. mt_srand(make_seed());

Aunque cabe notar que:

Citar
Nota: Desde PHP 4.2.0, no es necesario usar una semilla para usar el generador de números aleatorios con srand() o mt_srand() ya que ahora se hace automáticamente.

http://php.net/manual/es/function.mt-srand.php