|
|
|
| Ответ 004 на задачу N 4.
С условиями задачи можно ознакомится по ссылке.
<!-- задача номер 4 -->
<!-- Axill -->
<?php
// Будем время считать
function getmicrotime(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
// Условия задачи
$letters='qwertyuioplkjhgfdsazxcvbnm';
$pass[0]='ee11cbb19052e40b07aac0ca060c23ee';
$pass[1]='dd97813dd40be87559aaefed642c3fbb';
$pass[2]='8dbc672497bdc46f88e864bb1121232c';
$pass[3]='3e10f8c809242d3a0f94c18e7addb866';
// Функция определения одного пароля.
// куча breakов обусловлена тем что я не знаю какая функция осуществляет принудительный выход
// из подпрограммы. Если такая функция код сокращается
function passw($letters,$pass){
$start=getmicrotime();
$fl=false;
for($i=0;$i<=strlen($letters);$i++){
if($fl) break;
for($j=0;$j<=strlen($letters);$j++){
if($fl) break;
for($k=0;$k<=strlen($letters);$k++){
if($fl) break;
for($l=0;$l<=strlen($letters);$l++){
if(md5($letters[$i].$letters[$j].$letters[$k].$letters[$l])==$pass){
$ret.=$letters[$i].$letters[$j].$letters[$k].$letters[$l];
$ret.=' time:'.(getmicrotime()-$start);
$ret.='</br>';
break;
$fl=false;
}
}
}
}
}
return $ret;
}
// Считаем все сразу паролию. В последнем вложенном цикле проверяем на соответствие хеша паролю
// Если соответствие найдено пароль удаляется из массива паролей, и дальше в переборе не участвует
function allpassw($letters,$pass){
$start=getmicrotime();
for($i=0;$i<=strlen($letters);$i++){
for($j=0;$j<=strlen($letters);$j++){
for($k=0;$k<=strlen($letters);$k++){
for($l=0;$l<=strlen($letters);$l++){
foreach($pass as $key=>$p){
if(md5($letters[$i].$letters[$j].$letters[$k].$letters[$l])==$p){
$ret.=$letters[$i].$letters[$j].$letters[$k].$letters[$l]."<br>";
unset($pass[$key]);
}
}
}
}
}
}
return $ret.' time:'.(getmicrotime()-$start);
}
echo "<b>По одному<b><br>";
echo passw($letters,$pass[0]);echo"<br>";
echo passw($letters,$pass[1]);echo"<br>";
echo passw($letters,$pass[2]);echo"<br>";
echo passw($letters,$pass[3]);
echo "<br><b>Все сразу: </b><br>";
echo allpassw($letters,$pass);
?>
Результаты:
По одному
user time:1.79323482513
igor time:2.00667405128
lena time:2.72851204872
atom time:4.87547087669
Все сразу:
user
igor
lena
atom
time:12.6485140324
|
http://www.softtime.ru/info/task.php?id_article=74 | |
|
|
|
|
|
|
|
для: SoftTime
(06.02.2006 в 15:16)
| | Достаточно громоздко и используются вложенные циклы, но зато пароли перебираются в куче и диапазон символов может быть легко расширен. | |
|
|
|
|
|
|
|
для: SoftTime
(06.02.2006 в 15:16)
| | Достаточно объемный код, но принцип ясен.
Если позволите несколько замечаний.
// куча breakов обусловлена тем что я не знаю какая функция осуществляет принудительный выход
// из подпрограммы. Если такая функция код сокращается
|
break(4) - в скобках уровень вложенности.
Скрипт позволяет лекго расширить диапозон символов, но не диапазон перебираемых слов. К тому же пропускаются слова 1,2,3-х буквенные. Явно в задании этого не было.
Скорость перебора достаточно высокая (сравнивая с другими) | |
|
|
|