Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ответ 007 на задачу N 4
 
 автор: SoftTime   (06.02.2006 в 22:10)   письмо автору
 
 

Ответ 007 на задачу N 4.
С условиями задачи можно ознакомится по ссылке.

<?php    
// Задача номер 4
//передаем функции в качестве параметров хэш и максимальное количество знаков в пароле
function decode_hash($hash$level$pass="")
{    
 global 
$final_pass;                                //определяем глобальную переменную по которой выходим из рекурсии
 
$level--;                                                                        //вычитаем один уровень вложенности
    
$chars="abcdefghijklmnopqrstuvwxyz";                    //массив используемых букв
    
for ($i=0$i<strlen($chars); $i++)
    {    
      if (
md5($pass.$chars[$i])==$hash$final_pass=$pass.$chars[$i];        //если хэш сходится, то запоминаем пароль
            
if ($level)                                                                                                                                            //если    глубина поиска позволяет
            
{
                
$pass.=decode_hash($hash$level$pass.$chars[$i]);            //то рекурсивно вызываем функция для поиска следующего знака
            
}
            if (
$final_pass) return $final_pass;                        //если пароль найден, то выходим из всех функций
    
}
}    

echo 
decode_hash("ee11cbb19052e40b07aac0ca060c23ee"4)."<br>";
unset(
$final_pass);
echo 
decode_hash("dd97813dd40be87559aaefed642c3fbb"4)."<br>";
unset(
$final_pass);
echo 
decode_hash("8dbc672497bdc46f88e864bb1121232c"4)."<br>";
unset(
$final_pass);
echo 
decode_hash("3e10f8c809242d3a0f94c18e7addb866"4)."<br>";
?>

За понятность можете сразу ноль ставить:) Алгоритм тоже не самый удачный. Но это работает и подбирает пароли любой длины!

http://www.softtime.ru/info/task.php?id_article=74

   
 
 автор: cheops   (08.02.2006 в 23:36)   письмо автору
 
   для: SoftTime   (06.02.2006 в 22:10)
 

Очень компактно и читабельно, нет вложенных циклов, вместо этого реализован оригинальный механизм рекурсии, перебираемые символы содержаться в строке $char и легко могут быть расширены. К недостатку следует отнести тот факт, что пароли перебираются отдельно, а не все скопом, хотя при такой реализации это может быть и не выгодно.

   
 
 автор: Artem S.   (09.02.2006 в 00:03)   письмо автору
 
   для: SoftTime   (06.02.2006 в 22:10)
 

Очень компактно. Данны поясняюшие комментарии, но все же есть пара замечаний.

>> strlen($chars);
Вынести из цикла в отдельную переменную, это ускорило бы поиск.
Скрипт работает снизу вверх (от 4 до 1 уровня) а не наоборот, когда заранее не извесно число символов. Это легко исправляется и я бы предложил сделать именно так ($levels++)

   
 
 автор: Loki   (09.02.2006 в 09:33)   письмо автору
 
   для: Artem S.   (09.02.2006 в 00:03)
 

>Вынести из цикла в отдельную переменную, это ускорило бы поиск.
При этом ее пришлось бы объявлять глобальной или передавать при вызове. Но, возможно, вы правы.

>Это легко исправляется и я бы предложил
А вот тут вы ошибаетесь: скрипт ищет пароли "в массе". Именно за счет этого и достигается высокая производительность. А если внести предлагаемые вами изменения, то они ни на что не повлияют (если, конечно, исправить условие рекурсивоного вызова, в противном случае, скрипт вобще перестанет работать).

   
 
 автор: cheops   (09.02.2006 в 13:36)   письмо автору
 
   для: Loki   (09.02.2006 в 09:33)
 

>А вот тут вы ошибаетесь: скрипт ищет пароли "в массе".
А чего-то не очень понятно, если скрипт ищет в массе, почему функция decode_hash() вызывается четыре раза?

   
 
 автор: Loki   (09.02.2006 в 14:36)   письмо автору
 
   для: cheops   (09.02.2006 в 13:36)
 

Потому что мы задаем глубину поиска 4. Можно задать и 5, тогда он одинаково долго будет искать и пароли из 4 и пароли из 5 символов.

   
 
 автор: cheops   (09.02.2006 в 14:54)   письмо автору
 
   для: Loki   (09.02.2006 в 14:36)
 

Хм... а я так понял, что глубина задаётся во втором параметре... а для каждого пароля функция вызывается каждый раз по новой...

   
 
 автор: Loki   (09.02.2006 в 15:33)   письмо автору
 
   для: cheops   (09.02.2006 в 14:54)
 

Так и есть. Просто поиск происходит не по возрастающей (1, 2, 3 символьный подбор), а сплошным потоком где встречаются пароли разной длины. Да вы и сами можете посмотреть, если вывести на экран строку без хеширования.

   
 
 автор: Artem S.   (09.02.2006 в 16:57)   письмо автору
 
   для: Loki   (09.02.2006 в 15:33)
 

Извените не доглядел, исправлюсь =)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования