我希望能够从给定长度生成所有可能的字符串,坦率地说,我不知道如何编写代码.因此,为了进一步解释,我和一位朋友想展示一些基本的黑客攻击技术,因此会出现强制攻击.当然,他将是我的受害者,那里没有违法的东西.
然而,他告诉我的唯一一件事是他的PW将是4个字符长,但我很确定他的PW不会出现在任何字典中,这很容易.
所以我提出了生成每个4-char-long-string的想法,包含az字符(无上限).
是否有人可以跟随代码编写这样的算法?我真的不打扰表演,如果需要1晚才能生成所有PW,那没问题.
别忘了,这只是出于演示目的.
您可以通过数字来完成它.从aaaa开始.然后增加"最不重要"的部分,所以aaab.继续前进,直到你到达aaaz.然后增加到aaba.重复,直到你到达zzzz.
所以你需要做的就是实现
String getNext(String current)
Run Code Online (Sandbox Code Playgroud)
为了扩展这个; 它可能不是最快捷的做事方式,但它是最简单的做法.
正如古老的谚语所说的那样 - "首先使它成为正确的,然后让它快速".获得通过所有测试的工作实现(你确实有测试,对吗?)就是你先做的.然后你重写它以使其快速,使用你的测试作为保证你没有打破核心功能.
绝对最简单的方法是使用四个嵌套循环:
char[] pw = new char[4];
for (pw[0] = 'a' ; pw[0] <= 'z' ; pw[0]++)
for (pw[1] = 'a' ; pw[1] <= 'z' ; pw[1]++)
for (pw[2] = 'a' ; pw[2] <= 'z' ; pw[2]++)
for (pw[3] = 'a' ; pw[3] <= 'z' ; pw[3]++)
System.out.println(new String(pw));
Run Code Online (Sandbox Code Playgroud)
这不能很好地扩展,因为添加额外的字符需要添加嵌套级别.递归方法更灵活,但更难理解:
void findPwd(char[] pw, int pos) {
if (pos < 0) {
System.out.println(new String(pwd));
return;
}
for (pw[pos] = 'a' ; pw[pos] <= 'z' ; pw[pos]++)
findPwd(pw, pos-1);
}
Run Code Online (Sandbox Code Playgroud)
调用这样的递归方法:
char[] pw = new char[4];
findPwd(pw, 3);
Run Code Online (Sandbox Code Playgroud)