2010-06-11 4 views
0
$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', 
    '{', '|', '}', '~' 
); 

Avec les caractères du tableau $chars, je voudrais trouver toutes les combinaisons possibles, pour une longueur jusqu'à $n.Comment construire une table de caractères

**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

Je suppose que vous ne devez pas supporter Unicode? – dan04

+0

@ Dan04, non ce sont les caractères imprimables en ASCII qui m'intéressaient cette fois. Mais comme vous pouvez le voir, le tableau de caractères est extensible si nécessaire. –

+0

Souhaitez-vous trouver toutes les combinaisons ou permutations possibles? – Zackman

Répondre

0

Cette fonction aura une gamme $permutation ne contenant que des éléments d'un autre réseau $set et générer la prochaine permutation jusqu'à une longueur maximale 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; 
} 

La fonction peut alors être utilisé d'une manière comme celui-ci, à itérer sur chaque permutation possible et vérifier contre un mot de passe haché.

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

Ce imprimerait Password found: "lol"

+0

Tout d'abord, je suis désolé de ne pas m'expliquer et mon idée est plus approfondie. [Je ne trouverai jamais un langage de programmation qui me libère du fardeau de clarifier mes idées.] (Http://xkcd.com/568/) Je souhaite que la valeur soit une chaîne, qui est éditée et changée à chaque exécution à travers une boucle, de sorte que je puisse hacher et tester sa valeur hachée par rapport à celle d'un autre hachage pour savoir si c'est le mot de passe des utilisateurs ou non. –

+0

J'ai mis à jour la fonction en conséquence. La fonction prend cependant un tableau au lieu d'une chaîne, pour plus de flexibilité (c'est-à-dire si vous voulez utiliser un ensemble avec des éléments à plusieurs caractères). – Zackman

0

Si vous voulez trouver juste un certain nombre de combinaisons possibles, il serait combinaison - mathématiques de permutation - Vous devez augmenter votre longueur $ n à une puissance d'éléments dans votre tableau. En Php qui serait:

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

n $ - la longueur de votre combinaison.

référence Math: combinations - permutations

post-scriptum Saluez la solution de Zackmans, mais je me demande si elle (et d'autres dans ce domaine) ne cause pas de délai de script PHP en raison de l'ampleur du problème.

+0

Devrait-il être 'echo pow (count ($ chars), $ n);'? – Zackman

+0

Non, exactement non. J'ai donné le lien, c'est l'exemple 2, page 259. La base est $ n. J'aimerais qu'il y ait plus de gens qui apprécient les réponses que de simplement critiquer parce que c'est parfois ennuyeux d'aborder un sujet, de présenter une réponse et de ne pas avoir un seul point. –

+0

De l'exemple de Mark, on voit que les répétitions sont autorisées. –

Questions connexes