@Bigg:
Zitat:
Um das Programm noch ein wenig zu beschleunigen, überprüfe ich die ersten > 2 KB
gleich großer Dateien. Sind dort Checksummen gleich, wird ein kompletter Scan durchgeführt und weiter gefiltert.
Diesen Ansatz kannst du weiter ausbauen. D.J.Bernstein, ein genialer Mathematiker und Analyst, benutzt bei seinen vielen mathematischen Verfahren ein ähnliches Vergleichsverfahren.
Du vergleichst immer Stückchenweise beide
Dateien solange sie gleich sind. Die Stückchen sind erst zb. 1024 Bytes groß, dann 1024*2 Bytes, dann 1024*4, 1024*8, 1024*16 usw. Bytes groß.
Wie man aber unschwer erkennen kann macht das ausschließlich nur dann Sinn wenn man viele
Dateien in parallel und sehr schnell und sehr frühzeitig im Vergleich wissen möchte wieviele
Dateien sich unterscheiden.
Vergleicht man aber immer sequientiell zwei
dateien miteinander dann macht ein solch kurzer Vergleich absolut keinen Sinn, denn dann vergleicht man die beiden
Dateien nur solange bis es einen Untrschied gibt oder eben falls sie gleich sind bis zum Ende der
Dateien. Bei dieser Methode hat man den Vorteil das man die beiden
Dateien nur einmalig öffnen und schließen muß, man hat also viel weniger Overhead pro
Datei.
Für einen Filescanner sollte man sequientiell vorgehen und die beiden
Dateien immer vollständig miteinander vergleichen bis sich der erste Unterschied findet. Dabei sollte man vom Ende zum Anfang hin die
dateien binär vergleichen. Einfach weil zb. EXE/
DLL's immer den gleichen Header besitzen aber meistens am Ende andere Resourcen enthalten. Oder weil WinWord Dokumente mit höherer Wahrscheinlichkeit den gleichen Kopf besitzen aber unterschiedlicher Footer. Oder weil eine ZIP
Datei am Anfang die gleichen
Dateien gezippt haben könnte, deren ursprüngliche Inhalte aber unterschiedliche waren und somit im Laufe der Komprimierung am Ende der ZIP
Datei andere Prüfsummen rauskommen. Die Wahrscheinlichkeit das zwei
Dateien sich am Ende unterscheiden ist also größer als das sie sich am Anfang unterscheiden. Programmiertechnisch ist der Vergleich von Hinten nach Vorne kein großer Aufwand, Performancetechnisch reduziert sich aber die Laufzeit auf Grund der unterschiedlichen Wahrscheinlichkeiten.
Gruß Hagen