Как я могу ускорить создание контрольной суммы MD5 в vb.net? - PullRequest
4 голосов
/ 17 марта 2010

Я работаю с некоторыми очень большими файлами, хранящимися на картах P2 (Panasonic). Часть процесса, который мы используем, состоит в том, чтобы сначала сгенерировать контрольную сумму файла, который мы собираемся скопировать, затем скопировать файл, а затем запустить контрольную сумму для файла, чтобы подтвердить, что он скопирован OK. Проблема в том, что файлы имеют большой размер (более 70 ГБ) и занимают много времени. Это проблема, поскольку в конечном итоге мы будем иметь дело с тысячами этих файлов.

Я хотел бы найти более быстрый способ генерации контрольной суммы, кроме использования System.Security.Cryptography.MD5CryptoServiceProvider Мне все равно, если это означает использование специализированной аппаратной карты, при условии, что она работает и не слишком дорого. Я бы предпочел иметь метод кодирования, который обеспечивал бы некоторую обратную связь относительно того, как далеко продвинулся процесс, чтобы я мог отображать его, как сейчас.

Приложение написано на vb.net. Я бы предпочел иметь возможность использовать его как компонент, библиотеку, ссылку в моем приложении, но я готов вызвать внешнее приложение, если скорость генерации контрольной суммы будет достаточно улучшена.

Само собой разумеется, контрольная сумма должна быть последовательной и правильной. : -)

Заранее спасибо за ваше время и усилия,

Richard

Ответы [ 2 ]

2 голосов
/ 17 марта 2010

Я вижу один потенциальный способ ускорить этот процесс: вычислить MD5 исходного файла при выполнении копирования , а не до этого.Это уменьшит количество раз, которое вам потребуется для чтения всего файла, с 3 (исходный хеш, копия, целевой хеш) до 2 (копия, целевой хеш).

Недостатком всего этого является то, что выВам придется написать свой собственный код для копирования (в отличие от простого использования System.IO.File.Copy), и существует ненулевая вероятность того, что в конечном итоге это окажется медленнее, чем трехэтапный процесс.

Кроме этого, я не думаю, что здесь можно многое сделать, поскольку весь процесс связан с вводом / выводом в соответствии с дизайном.Вы тратите большую часть своего времени на чтение / запись файла, и даже при скорости 100 МБ / с (приличная скорость ввода-вывода для вашего типичного диска SATA) вы в лучшем случае получите около 5,8 ГБ / мин.

С современным процессором затраты на вычисление MD5 (или чего-либо еще) не сильно влияют на результат, поэтому его ускорение не улучшит общую пропускную способность.Криптоускорители, в частности, здесь вам не помогут, поскольку, если реализация драйвера не очень эффективна, они добавят больше накладных расходов из-за переключателей контекста, необходимых для подачи данных на внешнюю карту, чем они сохранят.

Что вы хотите улучшить, так это скорость ввода / вывода.Платформа .NET уже довольно эффективна, когда дело доходит до этого (с использованием буферов хорошего размера, перекрывающихся операций ввода-вывода и т. Д.), Но возможно, что оптимизированное собственное приложение Windows будет работать лучше здесь.Мой совет: Найдите в Google несколько собственных калькуляторов MD5 и посмотрите, как они соотносятся с вашей текущей реализацией .NET.Если разница в скорости вычисления хеша составляет> 10%, стоит перейти к использованию указанного внешнего приложения.

1 голос
/ 18 марта 2010

Правильный ответ - избегать использования MD5. MD5 - это криптографическая хеш-функция, разработанная для обеспечения определенных криптографических функций. Просто для обнаружения случайной коррупции, это слишком сложно и медленно. Существует много более быстрых контрольных сумм, структуру которых можно понять, изучив литературу по обнаружению и исправлению ошибок. Некоторыми распространенными примерами являются контрольные суммы CRC , из которых CRC32 является очень распространенным, но вы также можете относительно легко вычислить 64- или 128-битные или даже большие CRC гораздо быстрее, чем хэш MD5.

...