Динамически изменить номер цикла итерации
Я пытаюсь сгенерировать комбинации и проверить данный хеш. Псевдокод, который я использовал как
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
чтобы найти столкновение.