[md5] Обеспечить быструю обработку.

Тема в разделе "WASM.BEGINNERS", создана пользователем devillsd, 30 май 2010.

  1. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Да, на любом.
     
  2. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Народ, хееелп, кто сталкивался, подскажите что делать. Юзаю fopen или CFile для потокового просчёта MD5, на маленьких файлах считает нормально, на больших - врёт. Пытаюсь юзать fstream, и тогда, readsome всегда возвращает 0, на любых файлах. Все операции пробовал делать с разными компиляторами (VS 6.0 VS 2008) и на разных ПК=).
    ПИПЕЦ..... ХЕЛП....
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    devillsd
    Приаттачте исходник, посмотрим.
     
  4. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Приатачил 2-ве версии, если будет нужно, добавлю 3-тью.
     
  5. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Заатачить не выходит.
    http://depositfiles.com/files/tj4i0bnju
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Попробуйте это.
    Код (Text):
    1. #include "Md5.hpp"
    2. #include <fstream>
    3. #include <iostream>
    4.  
    5. char* itoa(int value, char* result, int base);
    6.  
    7. int main (int argc, char* argv[])
    8. {
    9.     if (argc<2)
    10.         return 1;
    11.     char buf[0xffff];
    12.     std::ifstream ifs(argv[1], std::ios::binary);
    13.     if (!ifs.is_open())
    14.         return 1;
    15.     MD5 hash;
    16.     hash.Begin();
    17.     std::streamsize size = 1;
    18.     while(size)
    19.     {
    20.         ifs.read(buf, sizeof(buf));
    21.         size = ifs.gcount();
    22.         hash.Update(buf, size);
    23.     }
    24.     hash.End();
    25.     char szStr[33];
    26.     szStr[32] = 0;
    27.     for (int i=0; i<16; i++)
    28.     {
    29.         szStr[i*2]=0;
    30.         szStr[i*2+1]=0;
    31.         itoa(hash.GetHash()[i],&szStr[i*2], 16);
    32.         if (szStr[i*2+1]==0)
    33.         {
    34.             szStr[i*2+1] = szStr[i*2];
    35.             szStr[i*2] = '0';
    36.         }
    37.     }
    38.     std::cout<<szStr<<std::endl;
    39. }
    40.  
    41. /**
    42. * C++ version 0.4 char* style "itoa":
    43. * Written by Lukás Chmela
    44. * Released under GPLv3.
    45. */
    46. char* itoa(int value, char* result, int base) {
    47.     // check that the base if valid
    48.     if (base < 2 || base > 36) { *result = '\0'; return result; }
    49.  
    50.     char* ptr = result, *ptr1 = result, tmp_char;
    51.     int tmp_value;
    52.  
    53.     do {
    54.         tmp_value = value;
    55.         value /= base;
    56.         *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
    57.     } while ( value );
    58.  
    59.     // Apply negative sign
    60.     if (tmp_value < 0) *ptr++ = '-';
    61.     //*ptr-- = '\0';
    62.     --ptr;
    63.     while(ptr1 < ptr) {
    64.         tmp_char = *ptr;
    65.         *ptr--= *ptr1;
    66.         *ptr1++ = tmp_char;
    67.     }
    68.     return result;
    69. }
     
  7. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Хочется биться головой об стенку...
    Беру Ваш код, ничего не меняю, проверяю на небольших файлах - всё ок, на файлах более 100 мб - не верный hash...
    Уже скачал дома Dev C++ (это тот же GCC?) ... Почему VS на до мной так издевается?
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А может это тотал шалит? Попробуйте альтернативный тест, тот же md5sum. Сколько не проверял, всё время совпадают.
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Вот. Запускать md5sum -b "file"
     
  10. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Проверил md5sum. Результат тот же что и в Тотале=( . Выложите плиз, свой скомпиленый хешер, я его у себя попробую.
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Вот.
     
  12. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Нормально высчитывает=) Остаётся пинать на компилятор.=(
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    devillsd
    Это происходит с любыми файлами более 100mb? Очень странно.
     
  14. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Да, с любыми файлами большого размера (меньше 100 mb высчитывает правильно), попробуйте скомпилировать мой код, и получить хеш большого файла.
    Если всё будет ок, тогда точно компилятор.
     
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Используйте именно эту версию и всё заработает - http://wasm.ru/forum/viewtopic.php?pid=381158#p381158
     
  16. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Урряяяяяя!!! Работает! Огромнейшее спасибо. Вторая версия всё верно вычисляет.