Red*_*ite 4 java string recursion md5
我有一个字符串的MD5哈希值,存储为String
.我正在写一个小程序,通过蛮力找出原始字符串.
我想循环遍历一个子集char
.
以下代码适用于何时String.length() == 0
.
我无法弄清楚如何编辑此代码以使用可变长度String
s.我觉得我在递归的正确轨道上,但不能再进一步了.
我有以下代码:
public void attempt(String initial, String md5) {
for (char c = ' '; c < '~'; ++c) {
attempt = initial + Character.toString(c);
generatedMd5 = generateMD5(attempt);
System.out.println(attempt);
if (hashesMatch(md5, generatedMd5)) {
break;
} else attempt(attempt, md5);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我应该提到这是关于MD5的学术研究.
您正在进行" 深度优先 "搜索(并且深度不受限制!),如果您不添加深度检查,这几乎可以保证失败(耗尽您的堆栈).
您可能应该更好地想要进行广度优先搜索:您的循环应首先尝试导致添加字符的所有组合,然后,如果没有成功,则尝试使用每个增强字符串递归调用该方法.
无论如何,你应该总是添加一些深度检查.
编辑:两次思考,我不太确定你不应该先坚持深度.对于小深度和组合(字符范围),宽度优先只能在这里进行.可能的实施
// Breadth first returns null if not found
public String bruteforce(List<String> prefixes, String md5,int availdepth) {
if(availabledepth<0) return null;
List<String> newprefixes = new ArrayList<String>();
for(String prefix : prefixes) {
for (char c = ' '; c < '~'; ++c) {
String attempt = prefix + Character.toString(c);
generatedMd5 = generateMD5(attempt);
if (hashesMatch(md5, generatedMd5))
return attempt;
newprefixes.add(attempt);
}
}
// no success in this level go for next
return bruteforce(newprefixes,md5,availddepth-1);
}
// Depth first - returns null if not found
public String bruteforce(String prefix, String md5,int availdepth) {
if(availdepth <= 0) return null;
for (char c = ' '; c < '~'; ++c) {
String attempt = prefix + Character.toString(c);
if (hashesMatch(md5, generateMD5(attempt)))
return attempt;
String res = bruteforce(attempt, md5, availdepth-1);
if(res != null) return res;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)