Java脚本花费了太多时间来完成

时间:2016-04-04 04:48:46

标签: java performance time brute-force

我不知道如何让我的代码耗费更少的时间。我的任务是使暴力密码破解。我知道密码有多长,它包含哪些字符。到目前为止,我有这种方法。

    public boolean moznosti(char [] arr, String pr, int a, int b) {
    if (b == 0) {
        char [] heslo = pr.toCharArray();
        if(tryOpen(heslo)) {
            return false;
        }
        return true;
    }    
    for (int i = 0; i < a; i++) {
            String tmp = pr+arr[i];
            if (moznosti(arr, tmp, a, b-1) == false) {
                return false;
            }
            moznosti(arr, tmp, a, b-1);
    }
    return true;
}

}

heslo是密码。任何想法?

2 个答案:

答案 0 :(得分:0)

查看您的代码结构。

你有一个for循环,递归调用你的moznosti方法,每次调用它做同样的事情。

我不知道你的变量是什么意思,但假设a和b是4.你的第一个循环将使用相同的b参数调用你的moznosti方法4次。

这不是导致时间问题,而是你所拥有的地方:

if (moznosti(arr, tmp, a, b-1) == false)

因为moznosti方法返回一个布尔值,所以不需要检查它是否等于false或true,if语句括号仅在条件为真时传递。因此,在您的情况下,这可能更适用:

if (!moznosti(arr, tmp, a, b-1))

我认为大部分时间的部分是您检查基本情况的部分

if (moznosti(arr, tmp, a, b-1) == false)

答案 1 :(得分:0)

好的,我做到了!

public class BruteForceAttacker extends Thief {
private boolean konec;

@Override
public void breakPassword(int sizeOfPassword) {
    moznosti(getCharacters(), "", getCharacters().length, sizeOfPassword);       
}

public void moznosti(char [] arr, String pr, int a, int b) {
    if (konec != true) {
        if (b == 0) {
            char [] heslo = pr.toCharArray();
            if (tryOpen(heslo)) {
                konec = true;
            } 
            return;
        }

        for (int i = 0; i < a; i++) {
                String tmp = pr+arr[i];
                moznosti(arr, tmp, a, b-1);
        }
    }
}

}