Да, есть лучший способ. Во-первых, вместо того, чтобы запрашивать хэш всего файла, сожмите файл и сегментируйте сжатые данные в (скажем) блоках по 100 КБ и предоставьте последовательность хэшей, по одному на блок, после чего следует собственный хэш этой последовательности хэшей. Под собственным хешем я просто подразумеваю брать вектор хешей, хэшировать его и вставлять в конец вектора.
Теперь вы можете проверить, что этот вектор хэшей передан правильно, проверив сам хэш. Если он не проходит, повторно запросите хеш-вектор.
Второй этап - запрос передачи сжатых данных. По мере того, как это происходит, вы можете проверять с интервалом 100 КБ, что передача правильная и прерывается, как только вы получаете ошибку. Затем (если возможно) начните повторный запрос с того места, где вы остановились, «отметка прилива».
Наконец, вы можете безопасно распаковать данные. Многие алгоритмы декомпрессии будут выполнять дополнительную проверку целостности, что даст вам еще один этап проверки - защиту от любых ошибок программирования. Бесплатный чек того стоит.
Этот подход будет работать независимо от того, работаете ли вы над проверенным протоколом, таким как TCP / IP, или с ненадежным протоколом, таким как UDP. Сжатие данных, если вы этого еще не сделали, также будет значительным улучшением.
Единственный недостаток - это, очевидно, намного больше работы.