windows - Sammenligning af to filer i C ++

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en funktion, der sammenligner to filer for at se om de er de samme. Det læser filerne byte med byte og kontroller for at se, at de er de samme.

Problemet jeg har nu er, at for store filer tager denne funktion lang tid.


Hvad er den bedre og hurtigere måde at kontrollere, om filer er de samme?

Bedste reference


Når dine filer ikke er de samme, er de sandsynligvis af samme størrelse? Hvis ikke, kan du straks bestemme filstørrelserne (fseek til slutningen, ftell for at bestemme positionen), og hvis de 'er forskellige, så ved du, at de' ikke er de samme uden at sammenligne dataene. Hvis størrelsen er den samme, husk at fseek tilbage til begyndelsen.


Hvis du læser dine filer i store buffere af hukommelse og sammenligner hver buffer ved hjælp af memcmp (), vil du forbedre ydeevnen. Du behøver ikke at læse hele filen på en gang, bare indstille en stor bufferstørrelse og læs blokke af denne størrelse fra hver fil, for hver sammenligningsreaktion gennem din loop. Memcpy-funktionen fungerer på 32-bit værdier i stedet for 8 bit byte.

Andre referencer 1


Hvis du virkelig vil have en brute kraft sammenligning af to filer, kan mmaping hjælpe. [3]


Hvis du kender filstrukturen af ​​det, du læser, skal du læse unikke sektioner, som giver dig mulighed for hurtigt at identificere dem (fx en overskrift og relevante klumper/sektioner). Selvfølgelig vil du gerne have sine grundlæggende egenskaber før du sammenligner.


Generer hashes (eller noget), hvis du gør flere sammenligninger.

Andre referencer 2


Læs filerne i stykker af størrelse X. Med X op til 1-10-50 megabyte. Brug memcmp() på disse stykker.

Andre referencer 3


Mens der er en række eksempler på kryptografiske hashfunktioner, der bruger SHA eller MD5, er det bedre at bruge en ikke-kryptografisk hash, da det bliver hurtigere at sammenligne filer.


https://en.wikipedia.org/wiki/List\_of\_hash\_functions#Non-cryptographic\_hash\_functions[4]


FNV-hasen anses for hurtig til dine behov:


https://en.wikipedia.org/wiki/Fowler\_Noll\_Vo\_hash[5]

Andre referencer 4


Hvis du ikke er bekendt med hashing search på google om 'MD5' eller 'SHA' algoritmer.
Hashing er en af ​​de effektive metoder til at kontrollere sammenhængen mellem filer.
Det eneste du har brug for er at finde implementering af en af ​​disse algoritmer og kontrollere dem. for eksempel:


if(md5(file1Path) == md5(file2Path))
    cout<<"Files are equal"<<endl;
else
    cout<<"Files are not equal"<<endl;