Ver Mensaje Individual
  #21  
Antiguo 23-10-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Reputación: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
La velocidad se consigue por el hecho de trabajar con cadenas estilo C y es independiente de si vas de izquierda a derecha o al revés. Si eliminas comprobaciones y condicionales superfluos también aceleras el proceso. El hecho de no comprobar que se terminaron las combinaciones de caracteres no es casual, ya que si la cadena cumple la condición de contener solo los caracteres existentes en Rango, el resultado lo encuentra sí o sí, por lo tanto no puene entrar en un bucle infinito y ganamos rendimiento.

Una cosa que hace perder rendimiento es usar el resto de la división en el bucle principal, que es el más largo. Si lo eliminamos, le procesador hará menos cálculos, perdemos un poco de elegancia en el código pero ganamos algo de tiempo. Como ejemplo pongo lo siguiente:

Código PHP:
bool FuerzaBruta(charSerialcharSalidacharRango)
{
  
int L strlen(Serial);
  
int R strlen(Rango);
  
int ni;

  for(
n=0n<Ln++) Salida[n] = *RangoSalida[n] = 0;
  
  
int r=00;
  do{
    *
Salida Rango[r];
    
//acarreo
    
for(int c=0Salida[c]==*Rango && f>0c++){
      for(
i=0Rango[i] && Rango[i]!=Salida[c+1]; i++);
      
Salida[c+1] = Rango[(i+1)%R];
    }
    
f=1;
    
r++; if(r==Rr=0;
  }while(
strcmp(SalidaSerial));
  return 
true;

Cambio el tipo de bucle a do while, lo que me obliga a incrementar el índice r y añado otra variable (f) para detectar que no es la primera vez que pasamos por el primer carácter de Rango. No compruebo que se terminaron las combinaciones porque encontraré el Serial obligatoriamente.

Un paso más puede ser escribirlo en asm, no lo he hecho pero es muy probable que incremente algo la velocidad
Responder Con Cita