Zip-Datei hat unterschiedliche Ckecksummen,warum?

pizza1234

Erfahrenes Mitglied
Hi,
ich erzeuge eine Zip-Datei aus mehreren bestehenden PDF-Dokumenten. Muss nicht eigentlich die Checksumme des ZipFiles immer gleich sein, egal wie oft ich die ZIP-Datei erzeuge? Warum sind die Checksummen verschieden?

Code zum Erzeugen der ZIP-Files
Java:
public static synchronized void zipDocuments(String zipArchiveName, String fileDir,List<Documents> documents,boolean byId)
{
		ZipOutputStream zos = null;
		FileInputStream fis = null;
	
		byte[] buff 	= new byte[TenderUtils.MAX_FILE_SIZE];
		int bytesRead 	= 0; 
		try
		{
			zos = new ZipOutputStream(new FileOutputStream(zipArchiveName));
			zos.setLevel(Deflater.BEST_COMPRESSION);
			
			for (Documents docs : documents)
			{
				if(docs.getFileSize() == 0)
					continue;

				String entryName = "";
				
				if(byId)
					entryName = docs.getId()+"."+docs.getMimeType();
				else
					entryName = docs.getFileName();

				ZipEntry entry = new ZipEntry(entryName);
		
				zos.putNextEntry(entry);
				
				fis = new FileInputStream(new File(fileDir + docs.getId()));
				while(-1 != (bytesRead = fis.read(buff, 0, buff.length)))
					zos.write(buff, 0, bytesRead);
				
				zos.closeEntry();
			}
		
		} catch (IOException e)
		{
			logger.error(e.getMessage());
		}
		finally
		{
			IOUtils.closeQuietly(zos);
			IOUtils.closeQuietly(fis);
		}
	}

für die Checksumme
Java:
public class MD5Checksum
{

	private static final Logger logger = Logger.getLogger(MD5Checksum.class);
		
	public static byte[] createChecksum(String filename) throws Exception
	{
		FileInputStream fis = new FileInputStream(filename);
		MessageDigest md5 	= MessageDigest.getInstance("MD5");
		md5.reset();
		int len = 0;
		byte[] buffer = new byte[8192];

		while( (len = fis.read(buffer)) > 0) 
			md5.update(buffer, 0, len);

		return md5.digest();

	}

	public static String getMD5Checksum(String filename) throws Exception
	{
		byte[] b = createChecksum(filename);
		String result = new String(Hex.encodeHex(b));

		return result;
	}

}

Vielleicht weiß einer von euch ja, warum das so ist bzw. was kann ich tun, damit ich für alle PDFs eine immer gleiche Checksumme bekomme?

Grüße,
Peter
 
Im Grunde ist wichtig, dass die PDF-Dateien die richtige Checksumme haben.

Wenn Du eine ZIP-Datei mit den selben Dateien öfters erstellst, ist es gut möglich das die Checksummen unterschiedlich sind. Ich kenne das ZIP-Format nicht im Detail, aber evtl. ändert sich die Reihenfolge, oder Zeitstempel, etc.

Hast Du schon einmal mit Total Commander, KDiff, etc. die Dateien verglichen? Evtl. erkennst Du dann die Unterschiede.
 
Hi Billie,
ich hab die Dateien mit KDiff und Winmerge miteinander verglichen und es ist grundsätzlich immer nur die erste Zeile sowie die letzen 3 Zeilen des Archivs unterschiedlich. Leider ist das alles total kryptisch und sagt mir nichts. Die Inhalte der Archive, also die einzelnen PDFs sind, wenn ich sie mit Winrar öffne, vollständig gleich, sowohl die Reihenfolge, wie auch die Checksummen!
Anscheinend werden die Unterschiede beim Erzeugen der Archive geschaffen!
Das ist natürlich sehr schlecht für mich! Ich benötige etwas, das für alle Dokumente irgendwie eine Checksumme erstellt, dich sich nicht ändert!
Ideen?

Grüße,
Peter
 
Hi,

wenn du wirklich nur die Checksumme willst, und die Dateien nicht packen o.ä. willst, dann könntest du die Datei einlesen und über die Binärdaten dann einen Hash à la SHA1 laufen lassen.

Dieser bleibt solange gleich, bis die Datei halt wirklich auch verändert wird und ist unabhängig von Metadaten des Dateisystems (Datum letzte Änderung / letzter Zugriff)

Gruß
BK
 
Hi.

In einem Zip wird ja auch ein Zeitstempel für jeden Zip-Eintrag gespeichert. Wenn du die Zeit nicht explizit setzt, wird dort die aktuelle Zeit (also Zeitpunkt der Ziperstellung) gespeichert. Speicher doch einfach von jeder Datei den Erstellungszeitpunkt (oder eine feste Zeit) für jeden Zipeintrag. Dann sollten die Zip-Dateien identisch sein - auch wenn sie zu unterschiedlichen Zeitpunkten erstellt wurden.

Gruß
 
Geht leider so nicht! (Damit meinte ich den Beitrag von Bratkartoffel) Ich habe eine beliebige Anzahl von PDF-Dateien und von denen brauche ich irgendwie genau 1 Checksum (o.ä.), die halt solange gleich bleibt, solange die PDFs nicht verändert werden.

Soeben hab ich das hier gefunden, was anscheinend eine Checksumme über alle Dokumente eines Ordners erzeugen kann, ohne das ich die Dateien packe:
http://www.jonelo.de/java/jacksum/index_de.html

Grüße,
Peter
 
Zuletzt bearbeitet:
Geht leider so nicht! (Damit meinte ich den Beitrag von Bratkartoffel) Ich habe eine beliebige Anzahl von PDF-Dateien und von denen brauche ich irgendwie genau 1 Checksum (o.ä.), die halt solange gleich bleibt, solange die PDFs nicht verändert werden.

Soeben hab ich das hier gefunden, was anscheinend eine Checksumme über alle Dokumente eines Ordners erzeugen kann, ohne das ich die Dateien packe:
http://www.jonelo.de/java/jacksum/index_de.html
Aber das ist doch genau der Vorschlag von Bratkartoffel gewesen?!
Java:
// Groovy code

MessageDigest md5   = MessageDigest.getInstance("MD5");

for(File f in files) {
  md5.update(f.readBytes());
}
Erzeugt von allen gegebenen Dateien eine MD5 Summe.

Gruß
 
Ah, jetzt hab ichs begriffen!
Super, vielen Dank!Funktioniert wunderbar und das zeitaufwändige Packen kann ich mir auch sparen!

Allerdings hab ich rein aus Interesse nochmal versucht, dem ZipEntry einen Zeitstempel mitzugeben und trotzdem waren die Checksummen nicht gleich! Woran kann das wohl liegen?

Grüße,
Peter
 
Ah, jetzt hab ichs begriffen!
Super, vielen Dank!Funktioniert wunderbar und das zeitaufwändige Packen kann ich mir auch sparen!

Allerdings hab ich rein aus Interesse nochmal versucht, dem ZipEntry einen Zeitstempel mitzugeben und trotzdem waren die Checksummen nicht gleich! Woran kann das wohl liegen?
Keine Ahnung. Zeig deinen Code. Bei mir funktioniert es:
Java:
// Groovy!

import java.util.zip.*


def zip = new ZipOutputStream(new FileOutputStream("c:/tmp/js1.zip"))

def dir = new File(".")

dir.eachFileMatch(~/.*\.pdf$/) {
    println "adding: $it"
    
    def entry = new ZipEntry(it.name)
    entry.setTime(it.lastModified())
    zip.putNextEntry(entry)
    zip.write(it.readBytes())
    zip.closeEntry()
}
zip.close()
Gruß

PS: Es kommt natürlich auch darauf an, das die Dateien in der gleichen Reihenfolge hinzugefügt werden...
 

Neue Beiträge

Zurück