如何减少生成字符串排列的运行时间?

时间:2017-11-23 15:59:54

标签: php algorithm recursion encryption

我编写了一个函数,它接受MD5哈希值并通过置换字符串的所有可能组合来查找其输入/原始值。根据BIT_CHEETAH对SO问题的回答:

  

...如果不尝试像强力黑客这样资源密集,不实用和不道德的事情,你无法解密MD5。

(资料来源:encrypt and decrypt md5

我很清楚这一点,但是,我正在使用这个场景来实现字符串排列功能。我还想坚持使用递归方法而不是其他方法。 Mark Byers的帖子可能总结了这样做的最佳总结:

 - Try each of the letters in turn as the first letter and then find all
   the permutations of the remaining letters using a recursive call.
 - The base case is when the input is an empty string the only permutation is the empty string.

Generating all permutations of a given string

无论如何,所以我实现了这个并得到了以下内容:

function matchMD5($possibleChars, $md5, $concat, $length) {
    for($i = 0; $i < strlen($possibleChars); $i++) {
        $ch = $possibleChars[$i];
        $concatSubstr = $concat.$ch;
        if(strlen($concatSubstr) != $length) {
            matchMD5($possibleChars, $md5, $concatSubstr, $length);
        }
        else if(strlen($concatSubstr) == $length) {
            $tryHash = hash('md5', $concatSubstr);
            if ($tryHash == $md5) {
                echo "Match! $concatSubstr ";
                return $concatSubstr;
            }
        }
    }
}

100%工作,但是当我传入一个四字符数组时,我的服务器运行10.7秒来生成一个匹配,其中匹配大约是所有可能排列方式的十分之一。函数permutes的有效字符称为$ possibleChars,包含所有字母数字字符和一些选定的字符:

0123456789.,;:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

问题:上述代码是否可以以某种方式运行得更快?

1 个答案:

答案 0 :(得分:0)

当做蛮力时,你必须经历所有可能性,没有办法在那里切角。因此,您需要对代码进行概要分析,以找出应用程序花费最多时间执行的操作,然后尝试对其进行优化。