Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.78
Delvox
7 / 7 / 1
Регистрация: 09.03.2013
Сообщений: 54
#1

Вычисление MD5 суммы папки - C++

22.08.2013, 08:16. Просмотров 3316. Ответов 18
Метки нет (Все метки)

Здравствуйте! Каким самым простым образом можно вычислить MD5 хеш папки?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2013, 08:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вычисление MD5 суммы папки (C++):

Генерация MD5 хеш суммы файла - C++
Сколько не пробовал, неправильно генерируется хеш! :( Ведь файл это набор символов. Потому я использовал функцию так как и с строкой. 8-)...

Непонятка с функцией md5 нахождения хэш - суммы - C++
Здравствуйте! Решил по чуть-чуть двигаться в сторону более высоких материй, в частности шифрование. Столкнулся с проблемой, в C++...

Вычисление суммы четных и суммы нечетных чисел в одномерном массиве - C++
1) Написать программу для вычисления суммы четных и суммы нечетных чисел в одномерном массиве!

Ввод элементов массива с клавиатуры, вычисление суммы по формуле, нахождение максимальной суммы - C++
Помогите дополнить код. Нужно, чтоб элементы массива вводились с клавиатуры. Выводилось на экран все суммы, которые вычисляются по формуле,...

Вычисление суммы квадратов четных чисел и суммы кубов нечетных чисел - C++
Написать программу вычисления суммы S квадратов четных и кубов нечетных чисел от 1 до N. Проверку числа на четность осуществить с помощью...

Вычисление степени матрицы, вычисления произведения двух матриц, вычисление суммы двух матриц - C++
Здравствуйте, помогите решить, пожалуйста: Заданы две квадратные матрицы А и В. Вычислить матрицу...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 09:29 #2
Посмотреть посчитанный? Винда же вроде считает какой-то хеш, его можно посмотреть в свойствах папки. Наверняка есть API для получения готового хеша.
1
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,370
22.08.2013, 11:37 #3
Мммммм.... Вообще-то MD5 (и вообще любой) хэш однозначно вычисляется только для последовательности байтов.

Так вот: что считать такой "последовательностью байтов" для папки, содержащей в общем случае неограниченное количество файлов и вложенных подпапок (каждая из которых является в общем случае точно такой же папкой)?
1
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 11:45 #4
Папка - это же по сути просто файл. Его хеш и считать. Вложенность на результат не повлияет.
0
Убежденный
Системный программист
Эксперт С++
15558 / 7066 / 1115
Регистрация: 02.05.2013
Сообщений: 11,475
Завершенные тесты: 1
22.08.2013, 12:09 #5
Цитата Сообщение от Delvox Посмотреть сообщение
Каким самым простым образом можно вычислить MD5 хеш папки?
Интересный вопрос.
Допустим, хэш папки равен хэшу всех файлов, находящихся в ней.
Тогда вопросы: в каком порядке считать хэши этих файлов ?
Учитывать ли имена файлов и папок (например, структура и файловый контент
папки может совпадать байт в байт, но при этом иметь разные имена файлов и
каталогов - в этом случае хэш папки должен быть одинаковым или разным) ?
Что, если в папке будут reparse points - как с них снимать хэш ?
Что, если во время вычисления хэша в папке произойдут изменения ?
Нужно ли учитывать атрибуты файлов (системный, только для чтения, и т.п.) ?
Что, если файлы будут содержать альтернативные NTFS-потоки - их считать или нет ?
Как считать хэши пустых файлов ?
Как реагировать на одинаковые имена, различающиеся только регистром (Paris и PARIS) ?
И так далее. В общем, не такая уж и очевидная задача...
1
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,370
22.08.2013, 12:16 #6
Во! Именно. Коллега Убежденный просто более развернуто и подробно задал ключевой вопрос.
Сам по себе подсчет MD5 (да и любого другого) хеша от последовательности байтов - тривиальная задача, но вот подсчет того же самого для папки - задача весьма нетривиальная....
1
Delvox
7 / 7 / 1
Регистрация: 09.03.2013
Сообщений: 54
23.08.2013, 04:41  [ТС] #7
Цитата Сообщение от Убежденный Посмотреть сообщение
Интересный вопрос.
Допустим, хэш папки равен хэшу всех файлов, находящихся в ней.
Тогда вопросы: в каком порядке считать хэши этих файлов ?
Учитывать ли имена файлов и папок (например, структура и файловый контент
папки может совпадать байт в байт, но при этом иметь разные имена файлов и
каталогов - в этом случае хэш папки должен быть одинаковым или разным) ?
Что, если в папке будут reparse points - как с них снимать хэш ?
Что, если во время вычисления хэша в папке произойдут изменения ?
Нужно ли учитывать атрибуты файлов (системный, только для чтения, и т.п.) ?
Что, если файлы будут содержать альтернативные NTFS-потоки - их считать или нет ?
Как считать хэши пустых файлов ?
Как реагировать на одинаковые имена, различающиеся только регистром (Paris и PARIS) ?
И так далее. В общем, не такая уж и очевидная задача...
Т.е. самым оптимальным и верным вариантом будет вычислить значение хэша для каждого файла в папке и подпапках, и потом их сложить вместе?
Тогда напрашивается два вопроса:
1) Как это можно реализовать WinApi функциями, или есть более простые библиотеки для работы с директориями?
2) Как вместе можно сложить хэши md5?

Или же, есть еще один вариант, это архивировать папку, и получить хэш уже .rar или .zip архива, мне кажется этот вариант более сложным.
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
23.08.2013, 10:16 #8
При наличии инструмента — ничего сложного
Код
$ tar -c folder | md5sum
9b9f07661b450531858834d8623e58f2  -
$ tar -c folder | md5sum
9b9f07661b450531858834d8623e58f2  -
$ touch folder/abc
$ tar -c folder | md5sum
5a4f0912e008835182921a094ce6a97b  -
$ touch folder/abc      
$ tar -c folder | md5sum
977854686e431948fe2bce9849c45a29  -
0
zer0mail
2334 / 1960 / 192
Регистрация: 03.07.2012
Сообщений: 7,033
Записей в блоге: 1
23.08.2013, 11:06 #9
ТС нечетко сформулировал вопрос, под "хеш папки" можно понимать:
а. хеш самого файла папки
б. хеш содержащихся в ней файлов
в. хеш содержащихся в ней и в ее подпапках файлов

наверное, это не все варианты, но даже по ним надо уточнять способ расчета:
- если хеш по файлу папки, то как учитывать удаленные записи?
- если по содержимому файлов, то в каком порядке их брать?
- что если у файла в папке изменится дата/время или имя, но содержимое не изменится?
0
Delvox
7 / 7 / 1
Регистрация: 09.03.2013
Сообщений: 54
24.08.2013, 07:53  [ТС] #10
Цитата Сообщение от zer0mail Посмотреть сообщение
ТС нечетко сформулировал вопрос, под "хеш папки" можно понимать:
а. хеш самого файла папки
б. хеш содержащихся в ней файлов
в. хеш содержащихся в ней и в ее подпапках файлов

наверное, это не все варианты, но даже по ним надо уточнять способ расчета:
- если хеш по файлу папки, то как учитывать удаленные записи?
- если по содержимому файлов, то в каком порядке их брать?
- что если у файла в папке изменится дата/время или имя, но содержимое не изменится?
Дата и время, насколько я знаю, не влияют на изменение хэша, хэш вычисляется по бинарному файлу.

Добавлено через 24 секунды
Цитата Сообщение от grizlik78 Посмотреть сообщение
При наличии инструмента — ничего сложного
Код
$ tar -c folder | md5sum
9b9f07661b450531858834d8623e58f2  -
$ tar -c folder | md5sum
9b9f07661b450531858834d8623e58f2  -
$ touch folder/abc
$ tar -c folder | md5sum
5a4f0912e008835182921a094ce6a97b  -
$ touch folder/abc      
$ tar -c folder | md5sum
977854686e431948fe2bce9849c45a29  -
Не понял, можете по конкретнее?
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
24.08.2013, 09:51 #11
Цитата Сообщение от Delvox Посмотреть сообщение
Не понял, можете по конкретнее?
Ну это я про сложность архивирования. При наличии архиватора организовать подсчёт суммы никаких проблем нет. Друге дело, что изменение времени модификации файла (вторая команда touch) будет приводить к изменению суммы. Более того, даже время модификации самого каталога folder будет влиять на сумму.

Если сумма должна зависеть только от содержимого файлов, то придётся обеспечить порядок обхода директорий в соответствии с каким-то порядком сортировки. Или же хэши отдельных файлов комбинировать коммутативно, чтобы от порядка обхода результат не зависел.
0
Ab
75 / 75 / 1
Регистрация: 03.05.2012
Сообщений: 161
24.08.2013, 10:25 #12
Delvox, прислушайтесь таки к Убежденному. Он только часть потенциальных проблем озвучил, но и их за глаза хватит. Либо делайте список файлов с указанием хеша для каждого из них, либо архивируйте папку и считайте хеш для получившегося файла-архива.
0
t1m0n
621 / 397 / 21
Регистрация: 03.11.2009
Сообщений: 1,829
24.08.2013, 19:26 #13
Цитата Сообщение от Delvox Посмотреть сообщение
MD5 хеш папки?
можете сказать в какой задачи вам это понадобилось? для каких целей
0
Delvox
7 / 7 / 1
Регистрация: 09.03.2013
Сообщений: 54
25.08.2013, 07:46  [ТС] #14
Цитата Сообщение от t1m0n Посмотреть сообщение
можете сказать в какой задачи вам это понадобилось? для каких целей
необходимо запретить изменение данных файлов в папке, а файлов много.
0
NinjaStar
46 / 48 / 2
Регистрация: 16.08.2013
Сообщений: 257
25.08.2013, 11:21 #15
Цитата Сообщение от Delvox Посмотреть сообщение
Дата и время, насколько я знаю, не влияют на изменение хэша, хэш вычисляется по бинарному файлу
Вот именно)) мы же когда берём хеш файла не вычисляем его с датами. легче всего рекурсивно пройтись по файлам папки в сортировке 0-9A-zА-я - и либо сложить хеш суммы в одну строку и вывести окончательный хеш, либо просто потоком из всех файлов вычислить сразу один хеш (разумеется вставляя названия файлов). Ну конечно для самых умных можно провести работу напрямую с файловой системой
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2013, 11:21
Привет! Вот еще темы с ответами:

Вычисление суммы - C++
Нужно написать програмку которая будет вычислять сумму 1! +2! +3 !+...+ N!, Используя функцию вычисления факториала числа к! Заранее...

вычисление суммы - C++
задана матрица целых чисел. вычислить сумму элементов матрицы, расположенных над главной диагональю

Вычисление суммы - C++
Вычислить \sum_{x-1}^{10}{a}_{n}. Исходные данные {a}_{n}=n!/2n

Вычисление суммы - C++
Подскажите, пожалуйста, в чем ошибка. Условие задачи: Вычислить сумму 1+1/2+1/3+...+1/10. #include <cstdlib> #include <iostream> ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.08.2013, 11:21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru