Организация работы ф-ций при хэшировании фалов по sha-256

Тема в разделе "WASM.WIN32", создана пользователем EvilsInterrupt, 27 мар 2006.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Здравствуйте.



    При хэшировании нужно:

    1. После процесса хэширования файл д.быть таким же посодержанию что и до хэширования

    2. Хэширование должно быть как можно более быстрым



    Чтобы захэшировать файл, я его с проектировал на память и через MapViewOfFile получил указатель!

    Как я понял из ISBN_5-469-01174-7,5-7502-0085-x:

    1. куда бы я не обратился,данную область память предоставит мне ОС сама!

    2. К тому же она не будет записывать данные из спроецированного файла в файл подкачки!



    Все вроде бы хорошо но передо мной встала такая ситуация:

    По документации FIPS180-2 работа идет с порядком, где старшие разряды начинаются с кране-левого разряда цифры и в сторону "право" разряды теряют свой вес к пр.1:

    Пр.1:

    100d - это сотня



    Когда же начинается реализация алгоритма для процессоров x86, то естественно львинная доля выпадает на работу команд с регистрами, а здесь уже вступает особенность, что при попадании значений в регистры порядок байт меняется! Если в памяти было:



    01 02 03 04



    то в регистре будет уже:



    04030201



    А это уже другая цифра!!!



    Чтобы легко было конверить из одного порядка в другой можно применить команду bswap, но тогда таких команд будет довольно много!



    Вопрос:

    Можно ли как то обойтись без команды bswap ?



    По Асе получил:

    1й хороший чувак:

    я думаю, нет.

    тем более, что BSWAP очень быстрая, хорошо распаралелливается и пр.



    2й хороший чувак:

    можно без неё, но я использовал



    ЗЫ:

    Перед окончательной реализацией хочется послушать еще советов!
     
  2. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Пока сделал так:

    Контстанты и хэши закинул в секцию экспорта, fasm.exe когда создает dll все dword`ы, так сказать bswap`ит! В итоге часть данных уже так как надо!



    Когда подоготавливаю рабочие слова стр. 19 FIPS180-2, то в цикле 0 =< t =< 16, кидаю 512битный блок в W так чтобы:

    1. dword`ы прошлии через bswap

    В итоге, вся арифметика становится нормальной!



    Можно ли избавиться от 1. ?
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Это Реализация на фасме!



    Вычисление хэша sha256calculate, получилось быстрее чем считает WinHEX

    12.2

    SR-11 :)))



    Рулез, протестируйте пожалуйста!



    Вот экпортируемая функция:



    sha256calculate,hFile,pHash,Count



    Здесь:

    hFile - Хэндл открытого файла подвергаемый хэшированию

    pHash - указатель на 32Байтную область памяти, здесь в результате

    функции

    будет хэш

    Count - Размер файла в байтах!



    Если кто-то еще может оптимизировать, буду только рад!

    [​IMG] _1103617469__hash.rar
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    EvilsInterrupt

    > "c проектировал на память и через MapViewOfFile получил указатель!"

    Не слушаешь ты добрых советов ;)

    При последовательном чтении маппинг не дает никаких преимуществ по сравнению с блочным чтением, кроме кажущейся простоты. А вот минусы есть. Во-первых, файлы >= 2Гб просто невозможно спроектировать целиком - MapViewOfFile просто вернет Null (интересно, что ты при этом будешь делать - сам выдашь тысячу извинений изверю или предоставишь ОС "отправить отчет" в Microsoft о твоей неста(де)бильной программе ;)) Во-вторых, маппинг нормально работает, когда размер MapView меньше размера доступной физ.памяти, а если больше то кранты :). Не знаю как эдвансед-серверы руководят маппингом, а вот ХРюша просто тупо засирает практически все ОЗУ и когда свободной памяти начинает не хватать, она кидается выбрасывать в файл подкачки все, что по ее неразумному мнению мешает твоему маппингу. Так что не беспокойся, твои данные в своп не улетят - улетит все остальное. Разве это не тупость - держать 256, 512 и т.п. метров ненужных давно обработанных данных и выгружать код и данные которые могут скоро понадобиться ?!! Ну и разумеется возникающие при этом тормоза зависят от того, сколько у тебя в системе параллельных процессов висит - открой парочку pdf-чиков со своей документаций и запусти обработку файла раза в два превышающего размер ОЗУ - тут даже системный монитор включать не нужно, по дикому верещанию диска и ужасно тормозного оживления системы после такого стресса поймешь, что к чему.

    Вывод: ОС сделает за тебя не все, а то что сделает, то не самым лучшим образом. Поэтому для надежности лучше проецировать файл "разумными" кусками. Ну а если кусками, то это ничем не проще и не лучше чем обычное блочное чтение. Теретически это хуже, т.к. при каждом Unmap\Map ты освобождаешь один блок памяти и выделяешь новый, каждый раз наступая на грабли отказа страниц при чтении, хотя практически время обработки этих отказов достаточно мало по сравнению с временем чтения данных из файла.
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    leo

    Блин, знаю что читать и читать книги, что и делаю, как жалко что знания не за один день приходят! :)))



    Спасибо, буду думать
     
  6. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    leo

    И блин, как уж так можно дать сначала прянник через CreateFileMapping,MapViwOfFile, а потом забрать, еще раз прочитал твой пост! Блин, кроме как Сволочами их больше ни как не назовешь!