Java For Loop帮助

时间:2011-02-27 02:43:37

标签: java for-loop nested-loops

您好 我需要创建一个Java SHA1暴力应用程序,并需要帮助for循环来创建要猜测的单词。我需要猜测1到6个字符之间的密码。所以我需要一个以A ... Z然后AA ...... AZ等开头的循环,因此随着时间的推移添加字母。

我使用Char数组来存储a-z中的字母和0到9之间的数字。这就是我循环的内容。

这是我现在的循环:

for (int a = 0; a<36; a++){

        guess[5] = letters[a];

         for (int b = 0; b<36; b++){

          guess[4] = letters[b];

             for (int c = 0; c<36; c++){

                    guess[3] = letters[c];

             for (int d = 0; d<36; d++){

                     guess[2] = letters[d];

                    for (int e = 0; e<36; e++){

                        guess[1] = letters[e];

                        for (int f = 0; f<36; f++){

                           guess[0] = letters[f];

感谢

4 个答案:

答案 0 :(得分:2)

您可能不希望使用任意嵌套循环来实现强力算法。相反,将它视为以任意基数计数,由不同的符号表示,例如[az,AZ,0-9等],但你可以将它们表示为从0-64或其他任何单位计算数字。这样你就可以从aaa开始,然后最终以aaA结束,aa0最终结果为999,如果生成3位数。

按照您的方式,将其扩展到更多位数需要修改代码。

答案 1 :(得分:0)

您对letters[i]的索引看起来不对。那应该是每个循环级别的索引吗?在第一个应该不是letters[a]

看起来这会循环遍历所有的组合,但是你有一些不正确的索引值和哇,我打赌这需要很长时间,大声笑。

答案 2 :(得分:0)

在最终理解了这个问题后(感谢@cHao),这是我的建议:

for (int len = 1; len <= 6; ++len) {
    // generate all words of length 'len'
    int [] index = new int[len + 1];
    while (index[len] == 0) {
        // generate the next guess
        for (int pos = 0; pos < len; ++pos) {
            guess[pos] = letters[index[pos]];
        }
        // increment the index
        for (int pos = 0; pos < len; ++pos) {
            if (index[pos] == letters.length - 1) {
                index[pos] = 0;
                // carry to the next position
            } else {
                ++index[pos];
                break;
            }
        }
        // use guess[0] through guess[len-1] as the next word at this point
    }
}

答案 3 :(得分:-2)

如果你的字母表是26个字符,那么你的单词对应的数字从1到26 ^ 6 - 1.所以一种方法是:

int val = 1 + new java.util.Random().nextInt(308915774); // [0 to 26^6 - 1)
String word = Integer.toString(val, 26).toUpperCase(); // from [0-9,A-P]
word = word.replace('0', 'Q');
// etc for '1', through '9', where '9' -> Z

如果你想要包含0-9(36个字符的字母),那么这个技巧就不会起作用了,因为36^6 - 1 > Integer.MAX_VALUE。我建议您使用Random.nextInt()来确定单词中将包含多少个字符,然后使用Random.nextInt()生成字母数组中的随机索引,从而生成多少个字符。