Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Вычисление md5 хеш суммы файла с прогресс баром. (http://forum.oszone.net/showthread.php?t=286107)

DoroViska 06-08-2014 20:17 2385868

Вычисление md5 хеш суммы файла с прогресс баром.
 
Задача вычислять md5 хеш сумму файла и отображать ход вычисления в прогресс баре.
метод уже готов осталось только как-то отобразить ход в прогресс баре.
Код:

private string ComputeMD5Checksum(string path)
        {
            using (FileStream fs = System.IO.File.OpenRead(path))
            {
                MD5 md5 = new MD5CryptoServiceProvider();
           
                byte[] fileData = new byte[fs.Length];
                fs.Read(fileData, 0, (int)fs.Length);
                byte[] checkSum = md5.ComputeHash(fileData);
                string result = BitConverter.ToString(checkSum).Replace("-", String.Empty);
                return result;
            }
        }


Iska 06-08-2014 20:37 2385875

Цитата:

Цитата DoroViska
осталось только как-то отобразить ход в прогресс баре.»

В приведённом коде нечего отображать в «прогресс баре». Разве что 0% до и 100% после.

DoroViska 06-08-2014 21:12 2385888

Iska, Ага нах нечего. 27 гб вычисляется минут 5 на галимом пк. висячая надпись подождите идёт вычисление md5 для нубка говорит о том что надо закрыть приложение буд-то оно зависло.

Iska 06-08-2014 22:33 2385915

DoroViska, обсценная лексика на конференции не приветствуется.

Как Вы предлагаете «влезть» внутрь метода «.ComputeHash()»?

DoroViska 07-08-2014 17:07 2386211

Iska, Вот тут то и дело что никак. а есть другие методы или либа ? может чё есть?

Iska 08-08-2014 02:44 2386420

Цитата:

Цитата DoroViska
а есть другие методы »

Смотрите, пробуйте: md5 with progressbar - Поиск в Google, может, найдёте подходящее по Вашим потребностям.

Вам, собственно, зачем сам хэш, под какие цели?

DoroViska 08-08-2014 08:40 2386456

Да лаунчер для обновления игры.

Iska 08-08-2014 09:16 2386465

Нужен более конкретный ответ. Как результат исчисления MD5 там используется?

DoroViska 08-08-2014 09:29 2386468

Iska, Для проверки файлов игры. кеш запрашиваться с сервера и лаучнер должен проверить игру.

Iska 08-08-2014 09:59 2386475

И 27 Gb у одного из файлов? Что ж это за игра-то.

Используйте менее трудоёмкие варианты, например, CRC32. Читайте и вычисляйте кусками, например, по 8-16 Мб (и тут-то делайте прогресс-бар), складывайте полученные хэши кусков в строку, затем хэшируйте саму эту строку. Вариантов много.

Вы ранее приведённую ссылку на поиск смотрели, пробовали подбирать что-нибудь?

User001 08-08-2014 13:06 2386541

Цитата:

Цитата DoroViska
27 гб вычисляется минут 5 на галимом пк »

Вы свою программу без прогресс-бара проверяли?

Поясните вот этот кусок:
Цитата:

Цитата DoroViska
byte[] fileData = new byte[fs.Length];
fs.Read(fileData, 0, (int)fs.Length); »

Насколько я понимаю, вы создаете массив размером = длина файла, а потом копируете весь файл в память. У вас 27 Гб ОЗУ? Начните с чтения учебника по .NET, к примеру...
Цитата:

Цитата Iska
Читайте и вычисляйте кусками, например, по 8-16 Мб (и тут-то делайте прогресс-бар), складывайте полученные хэши кусков в строку, затем хэшируйте саму эту строку. »

Да, часто бывает метод типа Update(byte []), которому можно по кускам скармливать...

Iska 08-08-2014 13:29 2386555

Цитата:

Цитата User001
Да, часто бывает метод типа Update(byte []), которому можно по кускам скармливать... »

Нет, тут я как раз напрямую говорю — мы не считаем хэш всего файла. Мы считаем хэши мелких кусков, склеиваем их в одну переменную (хоть массивом байт, хоть строкой) и ещё раз считаем хэш, теперь уже этого полученного набора. В авторском случае неважно считать хэш на весь файл или таким вот макаром. Хотя для самой задачи обновления давно есть решение — MSI.

Delirium 29-08-2014 07:06 2395620

Цитата:

Цитата DoroViska
висячая надпись подождите идёт вычисление md5 для нубка говорит о том что надо закрыть приложение буд-то оно зависло »

Ну раз уж нет возможности читать по кускам, добавьте вы надпись: Старт в <время>, покажите Прогресс бар, который не по квадратикам заполняется, а постоянно (свойство контрола). И добавьте текст - примерное время обновления - 5 минут. И в отдельном потоке таймер выполнения.
Когда человек видит, что на форме что то "тикает", это указывает ему на то, что приложение не зависло...

Iska 29-08-2014 07:50 2395625

Delirium, в этом случае не прогресс-бар нужен, а, скорее, что-то наподобие такого:

User001 29-08-2014 10:57 2395686

Цитата:

Цитата Iska
в этом случае не прогресс-бар нужен, а, скорее, что-то наподобие такого »

Не люблю когда такие элементы на прогресс бар похожими делают (квадратики циклически бегают).

Iska 29-08-2014 17:00 2395856

Так я и говорю, что не в виде полосы, а в виде круга.

Предложение же коллеги Delirium имеет право на жизнь в том случае, если время вычисления хэша объёма всего файла пропорционально коррелирует со временем вычисления хэша небольшой части, взятой для оценки. Т.е., к примеру, если соблюдается примерное соотношение (время вычисления MD5 для 1Gb / 2¹⁰) ≈ время вычисления MD5 для 1Mb. Так оно или нет — я не знаю, не проверял.


Время: 20:24.

Время: 20:24.
© OSzone.net 2001-