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

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

 

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

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

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

Ответ 013 на задачу N 4.
С условиями задачи можно ознакомится по ссылке.
Решение задачи 004
Репетунов Алексей Репетунов aka PantiL
Сначала я хотел сделать, как наверное многие и сделали, цепочкой вложенных циклов. Но не помню кто-то сказал, что длина пароля не превышает 4 символов - а я не заметил этой тонкости - может же быть и меньше (автор задачи тоже, наверное не заметил тонкости в этой строчке :))
У меня проверка идет от q и заканчивается решением задачи либо завершение времени выполнения. Думал если не будет успевать придется промежуточный вариант запомниать, перезагружать страничку, но это не потребовалось
А для оригинальности решил придумать класс, кторый будет формировать комбинации для проверки.
Принимайте на суд:

Искомые слова

user = 6.080303сек
igor = 6.879374сек
lena = 15.507789сек
atom = 8.946640сек




<?
//Класс - искомый пароль
class Pass
{
    private 
$arr_chars//Массив символов из которых возможно состоит пароль
           //Массив номеров(ключи массива arr_chars) символов из состоит проверяемая комбинация 
    //(символы проверяемого в данный момент вариата)
          
private $arr_num_chars;
          
//Конструктор класса
    
function __construct()
    {
        
//инициализируем массив символов из которых может состоять пароль
                    //Символы в том порядке в каком они на клаве - я не знаю алфавита :)
        
$this->arr_chars = array("q""w""e""r""t""y""u""i""o""p""a""s""d""f""g""h""j""k""l""z""x""c""v""b""n""m");
        
$this->arr_num_chars = array(0);
           }
    
//Вариант не подошел - делаем следующий
    
function plus_plus()
    {
    
//В этом массиве записаны ключи номера символов из которых состоит проверяемая  
          //комбинация
    
$this->arr_num_chars[(count($this->arr_num_chars)-1)]++;
    
//Так как в лат. алфавите 26 символов, 
          //то мы перебираем массив и следим чтобы номер символа не вышел за пределы
    //длины алфавита
    
for($i=(count($this->arr_num_chars)-1); $i>-1$i--)
    {
        
//Если всетаки вышли за предел
        
if($this->arr_num_chars[$i]>25)
        {
            
//Значит номер этого символа 0
            
$this->arr_num_chars[$i] = 0;
            
//Если есть предыдущий символ то его номер увеличиваем на 1
            //А если его нет то создадим его с номером 0
            
if(!isset($this->arr_num_chars[$i-1]))
            {
                
array_unshift($this->arr_num_chars"0");
            }
            else
            {
                
$this->arr_num_chars[$i-1]++;
            }
                                
        }
    }
    
//Проверяемая комбинация символов
    
$str_return "";
    
//Вот тут  ее формируем
    
foreach($this->arr_num_chars as $val)
    {
        
$str_return .= $this->arr_chars[$val];
    }
    return 
$str_return;
          }
}
//Хеш ломаемого пароля
$md5_hash "3e10f8c809242d3a0f94c18e7addb866";
//Создаем объект класса Пасс
$password = new Pass();
//Перебор выполняем пока не найдем результат или пока не закончится время
while(1)
{
        
$find_pass $password->plus_plus();
        
$md5_find_pass md5($find_pass);
        if(
$md5_find_pass==$md5_hash)
        {
                echo 
$find_pass;
                exit();
        }
}
?>


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

   
 
 автор: cheops   (09.02.2006 в 00:07)   письмо автору
 
   для: SoftTime   (07.02.2006 в 22:53)
 

Скрипт несколько громоздок, а использование класса не оправдано причём приводит к заметному падению скорости вычислений (а для этой задачи скрость очень критична). Использование класса также приводит к снижению читабельности. Однако диапазон символов легко раширяем и в решении не используются вложенные циклы по числу символов в пароле.

   
 
 автор: PantiL   (09.02.2006 в 11:31)   письмо автору
 
   для: cheops   (09.02.2006 в 00:07)
 

2cheops
Протестируеты плиз все скрипты на своей машине (или пусть это сделает кто-то), чтоб скрипты выполнялись в одной среде. Вот тогда и решим чей быстрее. Показатели моего скрипты неплохие, если учесть что пароль перебирается от одного символа до 4-х.

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

Это уже сделано - результаты в http://www.softtime.ru/forum/read.php?id_forum=7&id_theme=12866

   
 
 автор: Artem S.   (09.02.2006 в 22:17)   письмо автору
 
   для: SoftTime   (07.02.2006 в 22:53)
 

Скрипт трудно читаем, перегружен, не оправдано использование класса.
Плохо что используется while(1), надо выдавать предупреждение что не найден пароль.

   
Rambler's Top100
вверх

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