Hash сумма для контроля версий файлов

113
18 марта 2021, 05:00

Есть игровой клиент в котором около 2000 файлов размером от нескольких килобайт до сотен мегабайт. Все файлы бинарные, т.е. текстовых нет.

Клиент модифицируется мной время от времени и поэтому я использую самописный контроль версий через лаунчер для проверки целостности клиента игры и его обновлении при необходимости. Для этих целей использую md5 hash сумму файла. Поскольку MD5 Hash высчитывается достаточно долго (!), то использую два типа проверки - быструю (все важные файлы) и полную.

Так исторически сложилось, что по какой-то причине я стал изначально использовать именно этот Hash. Слышал и читал про Adler32 и CRC32 алгоритмы, но не уверен что в моём случае не возникнут коллизии, т.к. иной раз разница бывает в один байт у файлов, а может и полностью.

Если кто уже имел опыт вычисления быстрых и надёжных hash сумм для подобных задач, то подскажите более оптимальный алгоритм, т.к. полная проверка клиент на данный момент занимает около 5-10 минут (это где-то 11 гигабайт данных на диске) в зависимости от компьютера.

Answer 1

Итак, провёл ряд тестов и выяснил для себя, что использование 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. Как отписались в комментариях, сам алгоритм не влияет на производительность. Всё упирается в методы и возможности чтения самих файлов.

READ ALSO
mysql join count

mysql join count

Есть запрос:

94
Создание dblink к БД MySQL

Создание dblink к БД MySQL

Необходимо создать dblink к БД MysqlПросьба помочь

146
Выполнение миграций в консоли yii2

Выполнение миграций в консоли yii2

Есть проектВ нем есть миграции

110
Сохранить картинку на сервер

Сохранить картинку на сервер

Ребят, всем привет! столкнулся с такой проблемой - сохранение картинки на сервер

136