MD5 - это итерационный алгоритм. Вам не нужно рассчитывать тонну маленьких MD5, а затем как-то их комбинировать. Вы просто читаете небольшие фрагменты файла и добавляете их в дайджест по мере того, как собираетесь, так что вам никогда не нужно иметь весь файл в памяти сразу. Вот реализация Java.
FileInputStream f = new FileInputStream(new File("bigFile.txt"));
MessageDigest digest = MessageDigest.getInstance("md5");
byte[] buffer = new byte[8192];
int len = 0;
while (-1 != (len = f.read(buffer))) {
digest.update(buffer,0,len);
}
byte[] md5hash = digest.digest();
Et вуаля. У вас есть MD5 всего файла, но не весь файл в памяти сразу.
Стоит отметить, что если по какой-то причине вам понадобятся хеши MD5 для подразделов файла по мере продвижения (это иногда полезно для выполнения промежуточных проверок большого файла, передаваемого по соединению с низкой пропускной способностью), вы можете получить их путем клонирования объекта дайджеста в любое время, например
byte[] interimHash = ((MessageDigest)digest.clone()).digest();
Это не влияет на фактический дайджест-объект, поэтому вы можете продолжить работу с общим хешем MD5.
Стоит также отметить, что MD5 является устаревшим хешем для криптографических целей (таких как проверка подлинности файла из ненадежного источника) и должен быть заменен на что-то лучшее в большинстве случаев, например SHA-1. Для не криптографических целей, таких как проверка целостности файла между двумя доверенными источниками, MD5 по-прежнему подходит.