Чтобы сгенерировать два одинаковых zip-файла (включая идентичные md5sum) из одного и того же исходного файла, я бы рекомендовал использовать одну и ту же утилиту zip - либо всегда использовать одну и ту же программу Java, либо всегда использовать 7zip.
Утилита 7zip, например, имеет множество опций - многие из которых являются просто значениями по умолчанию, которые можно настраивать (или отличать в разных выпусках?) - и любая реализация Java zip также должна была бы явно установить эти опции.Если ваше Java-приложение может просто вызывать внешнюю программу «7z», вы, вероятно, получите лучшую производительность в любом случае, чем пользовательская реализация Java zip.(Это также хороший пример проблемы уменьшения карты, когда вы можете легко масштабировать реализацию.)
Но главная проблема, с которой вы столкнетесь, если у вас есть файл zip на стороне сервера и клиентСгенерированный zip-файл на стороне состоит в том, что zip-файл хранит две вещи в дополнение к оригинальному файлу: (1) имя файла и (2) метка времени файла.Если что-то из этого изменилось, то полученный zip-файл будет иметь другую md5sum:
$ ls tst1/
foo.tar
$ cp -r tst1 tst2
$ ( cd tst1; zip foo.zip foo.tar ) ; ( cd tst2; zip foo.zip foo.tar ) ; md5sum tst?/foo.zip
updating: foo.tar (deflated 20%)
updating: foo.tar (deflated 20%)
359b82678a2e17c1ddbc795ceeae7b60 tst1/foo.zip
b55c33c0414ff987597d3ef9ad8d1d08 tst2/foo.zip
Но, используя «cp -p» (сохранить временную метку):
$ cp -p -r tst1 tst2
$ ( cd tst1; zip foo.zip foo.tar ) ; ( cd tst2; zip foo.zip foo.tar ) ; md5sum tst?/foo.zip
updating: foo.tar (deflated 20%)
updating: foo.tar (deflated 20%)
359b82678a2e17c1ddbc795ceeae7b60 tst1/foo.zip
359b82678a2e17c1ddbc795ceeae7b60 tst2/foo.zip
YouВы найдете ту же проблему с разными именами файлов и путями, даже если файлы внутри zip идентичны.