Есть игровой клиент в котором около 2000 файлов размером от нескольких килобайт до сотен мегабайт. Все файлы бинарные, т.е. текстовых нет.
Клиент модифицируется мной время от времени и поэтому я использую самописный контроль версий через лаунчер для проверки целостности клиента игры и его обновлении при необходимости. Для этих целей использую md5 hash сумму файла. Поскольку MD5 Hash высчитывается достаточно долго (!), то использую два типа проверки - быструю (все важные файлы) и полную.
Так исторически сложилось, что по какой-то причине я стал изначально использовать именно этот Hash. Слышал и читал про Adler32 и CRC32 алгоритмы, но не уверен что в моём случае не возникнут коллизии, т.к. иной раз разница бывает в один байт у файлов, а может и полностью.
Если кто уже имел опыт вычисления быстрых и надёжных hash сумм для подобных задач, то подскажите более оптимальный алгоритм, т.к. полная проверка клиент на данный момент занимает около 5-10 минут (это где-то 11 гигабайт данных на диске) в зависимости от компьютера.
Итак, провёл ряд тестов и выяснил для себя, что использование ReadAllBytes()
для вычисления MD5 хеш сумм не самый удачный вариант.
Первоначально был такой код:
public static byte[] getFileHash(string path)
{
using (MD5 md5 = MD5.Create())
{
return md5.ComputeHash(File.ReadAllBytes(path));
}
}
Полный анализ файлов занимал 4 минуты 6 секунд.
После изменил ReadAllBytes()
на OpenRead()
и производительность увеличилась на 20%.
public static byte[] getFileHash(string path)
{
using (MD5 md5 = MD5.Create())
{
return md5.ComputeHash(File.OpenRead(path));
}
}
Последний вариант выполняет анализ за 3 минуты 10 секунд.
P.S. HDD -> НЖМД с интерфейсом Sata 2. Процесс анализа осуществляется в один поток. Думаю, в многопоточности можно ещё сэкономить в случае более лучшей конфигурации оборудования.
P.P.S. Как отписались в комментариях, сам алгоритм не влияет на производительность. Всё упирается в методы и возможности чтения самих файлов.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Ребят, всем привет! столкнулся с такой проблемой - сохранение картинки на сервер