$chars = array
(
' ',
'!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/',
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
':', ';', '<', '=', '>', '?', '`',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'{', '|', '}', '~'
);
使用$chars
数组中的字符,我希望找到所有可能的组合,最长为$n
。
**For Example**:
It should start off with ' ', and then go to '!'.
Once it gets to the end of the $chars array (`~`) it should add on another charter.
Run though those combinations ('! ', '" ', ... '~ ', ' !' ... '~~', ' ', ect).
And then just keep on going ...
答案 0 :(得分:2)
答案 1 :(得分:0)
此函数将使数组$permutation
仅包含来自另一个数组$set
的元素,并生成下一个排列,最大长度为$max
。
function next_permutation($permutation, $set, $max)
{
if (array_unique($permutation) === array(end($set)))
{
if (count($permutation) === $max)
{
return FALSE;
}
return array_fill(0, count($permutation) + 1, $set[0]);
}
foreach (array_reverse($permutation, TRUE) as $key => $value)
{
if ($value !== end($set))
{
$permutation[$key] = $set[array_search($value, $set) + 1];
break;
}
$permutation[$key] = $set[0];
}
return $permutation;
}
然后可以以这样的方式使用该函数,迭代每个可能的排列,并根据哈希密码进行检查。
$set = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
$max = 3;
$permutation = array($set[0]);
$password = '403926033d001b5279df37cbbe5287b7c7c267fa';
do {
$string = implode('', $permutation);
if (sha1($string) === $password)
{
echo 'Password found: "'.$string.'"';
break;
}
} while ($permutation = next_permutation($permutation, $set, $max));
这将打印Password found: "lol"
答案 2 :(得分:0)
如果你想找到许多可能的组合,它将是组合 - 排列数学 - 你必须将你的长度$ n提高到你的数组中元素的力量。在Php中将是:
echo pow($n, count($chars));
其中$ n - 你的组合长度。
数学参考:combinations - permutations
P.S。致敬Zackmans解决方案,但我不知道它是否(以及其他任何问题)因问题范围而导致PHP脚本超时。