Como construir uma tabela de personagens

$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', '{', '|', '}', '~' ); 

Com os caracteres da matriz $chars , gostaria de encontrar todas as combinações possíveis, por um comprimento até $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 ... 

Se você quiser encontrar apenas uma série de combinações possíveis, seria combinação – permutação de matemática – Você precisa aumentar seu comprimento $ n para um poder de elementos em Sua matriz. Em Php, isso seria:

 echo pow($n, count($chars)); 

onde $ n – o comprimento da sua combinação.

Referência matemática: combinações – permutações

PS Salute Zackmans solução, mas eu me pergunto se ele (e quaisquer outros nessa questão) não causa tempo limite script script por causa do alcance do problema.

Esta function usará uma $permutation matriz contendo somente elementos de outra matriz $set e gerará a próxima permutação até um comprimento máximo de $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; } 

A function poderia então ser usada de uma maneira como esta, para iterar sobre cada possível permutação e verificá-la contra uma senha hash.

 $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)); 

Isso imprimiria a Password found: "lol"