Динамически изменить номер цикла итерации

Я пытаюсь сгенерировать комбинации и проверить данный хеш. Псевдокод, который я использовал как

for i= 'a' to 'z'
{
    for j= 'a' to 'z'
    {
        for k= 'a' to 'z'
        {
            for l= 'a' to 'z'
            {
                hashStr = MD5(i+j+k+l);
                if(hashStr = targetHash)
                {
                    print "Match Found"
                    Exit
                }

            }
        }
    }
}

С помощью приведенного выше псевдокода я могу генерировать комбинации с фиксированной длиной 4 как

aaaa
aaab
aaac
...
zzzz

Возможно, кто-то может помочь мне написать логику таким образом, чтобы можно было легко изменить длину, не добавляя дополнительную итеративную форму цикла.

1 ответ

Решение

Как предполагает @TJ, рекурсия, вероятно, является наиболее прямым подходом.

JavaScript

var chars = 'abcdefghijklmnopqrstuvwxyz';

function loop(prefix, length) {
    if (length > 0) {
        for (var i = 0; i < chars.length; i++) {
            loop(prefix + chars.charAt(i), length - 1);
        }
    } else if (length == 0) {
        var hashStr = prefix;
        // ......
        // Your logic goes here         
        // ......
    } else {
        // length should always be non-negative
    }
}

function theLoop(length) {
    loop('', length);
}

Просто позвони theLoop(l) перебирать все строки длины l чтобы найти столкновение.


Java-код

void loop(int length) {
    loop("", length);
}

void loop(String prefix, int length) {
    if (length > 0) {
        for (char i = 'a'; i <= 'z'; i++) {
            loop(prefix + i, length - 1);     // concatenate prefix with char (i)
        }
    } else if (length == 0) {
        String hashStr = prefix;
        // ......
        // Your logic goes here         
        // ......
    } else {
        // length should always be non-negative
    }
}

Просто позвони loop(l) перебирать все строки длины l чтобы найти столкновение.

Другие вопросы по тегам