我编写了一个函数,它接受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
问题:上述代码是否可以以某种方式运行得更快?
答案 0 :(得分:0)
当做蛮力时,你必须经历所有可能性,没有办法在那里切角。因此,您需要对代码进行概要分析,以找出应用程序花费最多时间执行的操作,然后尝试对其进行优化。