Как построить таблицу символов - PullRequest
0 голосов
/ 11 июня 2010
$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 ... 

Ответы [ 3 ]

2 голосов
/ 11 июня 2010
0 голосов
/ 11 июня 2010

Если вы хотите найти только несколько возможных комбинаций, это будет комбинация - математика перестановок - вы должны увеличить свою длину $ n до степени элементов в вашем массиве.В Php это будет:

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

, где $ n - длина вашей комбинации.

Математическая справка: комбинации - перестановки

PS Salute Zackmansрешение, но мне интересно, если он (и любые другие в этом отношении) не вызывает тайм-аут сценария PHP из-за масштаба проблемы.

0 голосов
/ 11 июня 2010

Эта функция будет принимать массив $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"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...