想出一个可变长度的字符串?

Red*_*ite 4 java string recursion md5

我有一个字符串的MD5哈希值,存储为String.我正在写一个小程序,通过蛮力找出原始字符串.

我想循环遍历一个子集char.

以下代码适用于何时String.length() == 0.

我无法弄清楚如何编辑此代码以使用可变长度Strings.我觉得我在递归的正确轨道上,但不能再进一步了.

我有以下代码:

    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的学术研究.

leo*_*loy 6

您正在进行" 深度优先 "搜索(并且深度不受限制!),如果您不添加深度检查,这几乎可以保证失败(耗尽您的堆栈).

可能应该更好地想要进行广度优先搜索:您的循环应首先尝试导致添加字符的所有组合,然后,如果没有成功,则尝试使用每个增强字符串递归调用该方法.

无论如何,你应该总是添加一些深度检查.

编辑:两次思考,我不太确定你不应该先坚持深度.对于小深度和组合(字符范围),宽度优先只能在这里进行.可能的实施

  // 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)