В проекте C#, над которым я сейчас работаю, мы пытаемся вычислить MD5 большого количества файлов по сети (текущий банк равен 2,7 миллиона, клиентский банк может превысит 10 миллионов). С количеством файлов, которые мы обрабатываем, скорость возникает.C# Высокоскоростной MD5/SHA хэш по сети
Причина, по которой мы делаем это, заключается в проверке того, что файл был скопирован в другое место без изменений.
В настоящее время мы используем следующий код для вычисления MD5 файла
MD5 md5 = new MD5CryptoServiceProvider();
StringBuilder sb = new StringBuilder();
byte[] hashMD5 = null;
try
{
// Open stream to file to get MD5 hash for, create hash
using (FileStream fsMD5 = new FileStream(sFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
hashMD5 = md5.ComputeHash(fsMD5);
}
catch (Exception ex)
{
clsLogging.logError(clsLogging.ErrorLevel.ERROR, ex);
}
string md5sum = "";
if (hashMD5 != null)
{
// Change hash into readable text
foreach (byte hex in hashMD5)
sb.Append(hex.ToString("x2"));
md5sum = sb.ToString();
}
Однако скорость это не то, что мой менеджер надеялись. Мы внесли ряд изменений в способ и количество файлов, которые мы вычисляем для MD5 (т. Е. Мы не делаем это для файлов, которые мы не копируем ... до сегодняшнего дня, когда мой менеджер передумал вСЕХ файлы должны иметь MD5, рассчитанные для них, в случае, если в каком-то момент в будущем клиент хочет убраться с нашей программой, так что все файлы копируются я думаю)
Я понимаю, что скорость сети, вероятно, является основной (100 Мбит/с). Есть ли эффективный способ вычисления MD5 содержимого файла по сети?
Заранее спасибо. Trevor Watson
Редактировать: поместить весь код в блок, а не только его часть.
Есть ли причина, по которой вы не можете проверить хеши на локальном компьютере, на который были скопированы файлы? – arootbeer
Первым пунктом бизнеса является определение узкого места. Запустили ли вы какие-либо тесты, чтобы узнать, насколько быстро процесс занимает просто чтение файла и повторение, поскольку вы не вычисляете хэш? Затем с хешем; сколько накладных расходов приходится на вычисление? Вы выполняли одну и ту же задачу локально? –
Я согласен с Аароном: время, необходимое для вычисления хэша, - это сумма: открытие удаленного файла по сети, поиск начала на диске, чтение с диска, потоковое содержимое по сети, вычисление хэша. Любой из них может вызвать узкое место. Некоторые из них могут быть сделаны параллельно для разных файлов, как предложил Эндрю Купер. – wigy