Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Где узкое место


Автор: K0r0l 12.11.2004, 21:22
Код

while (dictfile) {

        // 1    
dictfile >> pair.pass_c;
       // =
   
       // 2
for (i = 0; i < len; i++) {
   
             // 3      
             // crypt with md5 PAIR.PASS_C
    md5_starts( &ctx );
             md5_update( &ctx, (uint8 *) pair.pass_c, (strlen(pair.pass_c)) );
             md5_finish( &ctx, md5sum );
             for( j = 0; j < 16; j++ ) {
        sprintf( output + j * 2, "%02x", md5sum[j] );
             }
             // ========================
            // =
            if( !memcmp( output, pair.hash_c[i], 32 ) ) {
     rf << pair.name_c[i] << ":" << pair.pass_c << "\n";
   }

        }
        // =
   
}


то есть как можно ускорить работу этого цикла?

поясню если кто не понял:
1) читаем из словаря строку
2) цикл пока не прочли все из словаря и внутри цикла действие № 3 - создание md5 хеша от прочитанной строки

Автор: bel_nikita 12.11.2004, 21:39
K0r0l
с первого взгляда, нужно ли в цикле все время вычислять strlen(pair.pass_c) ?

Автор: K0r0l 12.11.2004, 21:41
да, посколько мы его только что прочитали.. а длина паролей в словаре разная

Автор: bel_nikita 12.11.2004, 22:15
K0r0l
еще не совсем въехал, но читаешь в
Код
dictfile >> pair.pass_c;

так и вычисли
Код
strlen(pair.pass_c)
перед циклом
Код
for (i = 0; i < len; i++) {

вроде pair.pass_c в цикле №2 не меняется. или меняется?

Автор: K0r0l 14.11.2004, 01:50
ты прав не меняется... но вот парадокс...
добавил такую строчку после dictfile >> pair.pass_c;

pass_len = strlen(pair.pass_c);


ну и внутри цикла подставляю эту переменную...



так прога вместо того чтобы выполняться быстее выполняется медленнее! смотри лог:

1) новая версия
real 0m4.665s
user 0m4.610s
sys 0m0.030s


2) старая версия
real 0m4.302s
user 0m4.300s
sys 0m0.000s


это средние значения после трех тестовых запусков.. ничего не понимаю ))

Автор: bel_nikita 14.11.2004, 02:16
K0r0l
и ничего нигде больше не менял, кроме вычисления длины перед циклом?

Автор: K0r0l 14.11.2004, 13:40
Код

while (dictfile) {
   
     dictfile >> pair.pass_c;
     pass_len = strlen(pair.pass_c);
     
     for (i = 0; i < len; i++) {
     
      // crypt with md5 PAIR.PASS_C
      md5_starts( &ctx );
                 md5_update( &ctx, (uint8 *) pair.pass_c, pass_len);
      md5_finish( &ctx, md5sum );
     
      for( j = 0; j < 16; j++ ) {
                  sprintf( output + j * 2, "%02x", md5sum[j] );
                 }
     
      // ==========================
     
      if( !memcmp( output, pair.hash_c[i], 32 ) ) {
       // result std (file or console)
       if (rf) {
        rf << pair.name_c[i] << ":" << pair.pass_c << "\n";
       } else {
        cout << pair.name_c[i] << ":" << pair.pass_c << "\n";
       }
       // ============================
      }
     
       
     }
   
   
    }



неа....
а может проверку совпадения хеша паролю как нить по-другому организовать...
сорри что достаю, но может есть еще какие-нить идеи...

Автор: Mad 14.11.2004, 14:03
K0r0l
Насколько я знаю, замедления работы зачастую вставляют прямо в MD5 функции (защита от подбора, чем дольше проверяется пароль тем меньше вероятность потбора, точнее надо больше времени на проверку всех вариантов).


Цитата(K0r0l @ 14.11.2004, 12:40)

for( j = 0; j < 16; j++ ) {
          sprintf( output + j << 1, "%02x", md5sum[j] );
    }

ненамного, но быстрей smile

Автор: K0r0l 19.11.2004, 20:58
хм... компилятор одинаковый код выдал для двух этих конструкций ))

Автор: sergejzr 19.11.2004, 21:01
Не пользуйтесь стримами, а читайте из файла блоками функцией read.
Правда парсить блоки в цифры и строки самому придётся, но будет намного быстрее smile

Автор: K0r0l 19.11.2004, 22:25
уже пробовал там все равно код получается громоздким.. нужно еще \0 отрезать от получаемой строки.. и пр геморой...

но все равно спасибо

Автор: po-her 20.11.2004, 00:15
Подскажите как это считается время выполнения цикла, программы, функции...? smile

Автор: sergejzr 20.11.2004, 00:23
В Юниксах это smile
Запускаете свою программу, например"my.out", так:
time my.out

На экран выходит информация smile
Но это только общее время выполнения.

Автор: po-her 21.11.2004, 17:23
А если я под windows программирую.. Тогда как?

Автор: chipset 21.11.2004, 17:41
GetProcessTimes работает только в NT

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)