|
|
|
| Ответ 011 на задачу N 4.
С условиями задачи можно ознакомится по ссылке.
<?php
/* Принцеп "барабанов". На различных старых устройствах
были такие счетчики. Каждый разряд крутился и после 9 прокручивался
следующий барабан, когда и он дохожил до 9 прокручивался следующий и т.д.
Тут барабанами явл. символы. и после последнего символа алфавита,
он прокручивает следующий разряд */
set_time_limit(0);
ob_implicit_flush();
// Хеш
$passHash = "8dbc672497bdc46f88e864bb1121232c";
// Алфавит перебора
$maskArr = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
"n", "o", "p", "q", "r", "s", "t", "u", "v", "x", "y", "z",);
// Размер слова
$maskSize = 4;
// Размер алфавита
$maskArrSize = sizeof($maskArr) - 1;
// Последний символ
$lastChar = end($maskArr);
// Последний пароль
$lastPass = str_repeat($lastChar, $maskSize);
// Первый символ и будет 1 словом
$pass = $maskArr[0];
// Индекс слудующей буквы для первого символа
$index = 1;
// Функция время работы в долях секунд
function getmicrotime() {
list($usec, $sec) = explode(' ', microtime());
return ((float)$usec+(float)$sec);
}
echo "searching....<br> ";
// Фиксируем начало
$start_time = getmicrotime();
// Подбераем пока не совпадет или не закончатся слова
while ($passHash != md5($pass) && $pass != $lastPass) {
// Проверяем что прошли весь алфавит
if (!isset($maskArr[$index])) {
// сбрасываем 1ый барабан в 1ый символ
$index = 0;
$num = 0;
// Может получиться что один "барабан" повлечет
// за собой все остальные - по этому цикл
do {
// сбрасываем текущий "барабан" на первый символ алфавита
$pass{$num} = $maskArr[0];
// переходим в след. разряд
$num++;
// он был?
if (isset($pass{$num})) {
// находим индекс значения из алфавита и добавлем +1 (следующий индекс)
$newindex = array_search($pass{$num}, $maskArr) + 1;
} else {
// иначе индекс 0 (первый символ алфавита)
$newindex = 0;
}
// пока "барабаны" не перестануть крутиться
// а условием этого что есть еще буквы из алфавита
} while (!isset($maskArr[$newindex]));
$pass{$num} = $maskArr[$newindex];
} else {
// инче меняем первый барабан
$pass{0} = $maskArr[$index];
}
// увеличиваем индекс
$index++;
}
if ($passHash == md5($pass)) {
echo "Found! ";
echo $passHash ." = ".$pass;
} else {
echo "Not found ";
}
$end_time = getmicrotime() - $start_time;
echo " <br>Spend time: ", $end_time, "sec";
?>
|
http://www.softtime.ru/info/task.php?id_article=74 | |
|
|
|
|
|
|
|
для: SoftTime
(07.02.2006 в 14:50)
| | Немного громоздко и загадочно, но диапазон легко расширяем, нет вложенных циклов и используется функция set_time_limit(0), которая для такой задачи более чем уместна. | |
|
|
|
|
|
|
|
для: SoftTime
(07.02.2006 в 14:50)
| | У меня почему-то не находит lena? Остальное находит. | |
|
|
|