suche algorithmus



  • hallo, ich suche eine Funktion oder algorithmus, der mir alle möglichen
    zusammensetztungen aus zahlen und buchstaben macht,
    (bruteforce) wenn a falsch ist dann b c..z. za ...zz
    ich hoffe ich verstehe was gemeint ist. mich würde nur mal interessieren wie das geht und nen selbsttest an nem eigenen programm durchführen.
    Danke



  • NEDD1j schrieb:

    hallo, ich suche eine Funktion oder algorithmus, der mir alle möglichen
    zusammensetztungen aus zahlen und buchstaben macht,
    (bruteforce) wenn a falsch ist dann b c..z. za ...zz
    ich hoffe ich verstehe was gemeint ist. mich würde nur mal interessieren wie das geht und nen selbsttest an nem eigenen programm durchführen.
    Danke

    Wie wärs mit selbst programmieren?


  • Administrator

    Habe nicht so recht verstanden, was du suchst. Aber könnte vielleicht dies zutreffen?
    http://www.cplusplus.com/reference/algorithm/next_permutation.html
    http://www.cplusplus.com/reference/algorithm/prev_permutation.html

    Grüssli



  • #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    
    const char key_table[] = 
    {
        'a',    'b',    'c',    'd',    
        'e',    'f',    'g',    'h',    
        'i',    'j',    'k',    'l',
        'm',    'n',    'o',    'p',    
        'q',    'r',    's',    't',    
        'u',    'v',    'w',    'x',
        'y',    'z',    
    };
    
    int main( int argc, char** argv )
    {
        char*   cpStr       = NULL;
        unsigned int
                n           = 0,
                m           = 26,
                j           = 0,
                k           = 0;
        unsigned long long int
                l           = 0,
                c           = 0;
    
        if( argc != 2 )
        {
            return 0;
        }
    
        n = atoi(argv[1]);
        l = pow( m, n );
    
        if( n < 1 )
        {
            return 0;
        }
    
        cpStr = malloc( n+1 );
        memset( cpStr, key_table[0], n );
        cpStr[n] = '\0';
    
        hasheriz0r:
        for( j = (n-1); j>=0; j-- ) 
        {     
    	    if( j == (n-1) )
    	    {
    	        for( k = 0; k < m; k++ )
    	        {
    	            cpStr[j]=key_table[k];
    	            c++;
    	        }
    	    }	        
    	    else if( cpStr[j] != key_table[m-1]
    	    &&  cpStr[j+1] == key_table[m-1] )
    	    {
    	        cpStr[j+1] = key_table[0];
    	        cpStr[j]++;
    	        goto hasheriz0r;
    	    }
    
            if( c == l )
            {
                break;
            }
        }    
    
        printf( "Runs:\t%I64d\nShould:\t%I64d\n", c, l );
    
        free( cpStr );
    
        getchar();
        return 0;
    }
    

    Geht mit Sicherheit noch sehr viel eleganter..



  • feraL schrieb:

    Geht mit Sicherheit noch sehr viel eleganter..

    In C++ auf jeden Fall.


  • Administrator

    Mir wäre lieber, wenn jemand den Algo erklären könnte. Der Algo von feraL macht irgendwie überhaupt gar keinen Sinn. Wenn man zum Beispiel n = 1 einsetzt oder n = 2 dann kommen da Ergebnisse raus ... Und der Code, welcher ausgeführt wird ... 😮

    1. Kein C++
    2. Das goto könnte man einfach mit einem j = (n-1) ersetzen. Finger weg von gotos!
    3. Grässliche Variablenbenennung. Vielleicht verstehe ich den Algo schon nur deshalb nicht.
    4. Diese Schleife macht für mich überhaupt keinen Sinn (53 - 57):

    for( k = 0; k < m; k++ )
    {
      cpStr[j]=key_table[k];
      c++;
    }
    

    Das könnte man gleich als das folgende schreiben:

    cpStr[j] = key_table[m - 1];
    c += m;
    

    5. Die Variable n wird zu spät auf Korrektheit geprüft:

    n = atoi(argv[1]); // <- Das ist ganz klar C!
    
    if( n < 1 )
    {
      return 0; // Fehlermeldung?
    }
    
    l = pow( m, n ); // Nach der Überprüfung sollte sowas ausgeführt werden.
    

    6. Nirgends Fehlermeldungen, deshalb weiss ich auch jetzt noch nicht, was man als n eigentlich zu übergeben hat.
    7. Am besten diesen Code gar nicht erst benutzen ... schon nur, weil es kein C++ ist 😉

    Grüssli



  • rekursiv statt goto



  • Was du suchst ist John the Ripper, das ist auch open source, wenn du wirklich am Algorithmus und weniger am Cracken eines Passworts interessiert bist.


Anmelden zum Antworten