Kezdőoldal » Számítástechnika » Programozás » Jelentősen gyorsabb két fájlt...

Jelentősen gyorsabb két fájlt hashelni majd a kapott hasht összehasonlítani, mint a két fájlt bitenként?

Figyelt kérdés

2015. okt. 9. 17:24
1 2
 11/12 anonim ***** válasza:

Eleve úgy kezdted a kérdést, hogy 2 fájl, erre kiderül, hogy 1000 db. Akkor most melyik?


Ha sok fájlod van, akkor:

1. generálsz hash-t minden fájlnak

2. összehasonlítod őket

3. ami egyezik, azt bájtonként leellenőrzöd, ami nem az különbözik

2015. okt. 10. 00:24
Hasznos számodra ez a válasz?
 12/12 2xSü ***** válasza:

Nézzük meg kicsit az esélyeket. Az MD5 128 bites adatsor, tehát összesen 2^128 = 3,4 * 10^38 különböző hash létezhet. Az md5 azt ígéri, hogy egy bitnyi információváltozás átlagosan a hash bitjeinek felét változtatja meg, így mondhatjuk azt, hogy nagyjából minden hash azonos eséllyel generálódik, ha mondjuk random tartalmat hash-elsz.


Tegyük fel, hogy nem 1000 fájlod van, hanem százmillárd. Ekkor ezek 10^11 * (10^11-1) féle módon képezhetnek párokat, ami kb. 10^22 különböző párt jelent.


Annak az esélye, hogy két fájl md5 hash-e megegyezik 1 : 34 028 236 692 434 128. Ez még mindig valószínűtlenebb, mint az, hogy kétszer egymás után lesz ötösöd a lottón.


Szóval igen, kvázi elhanyagolható az esélye annak, hogy két fájl md5 hash-e megegyezik. Elhanyagolható, de azért nem nulla.


Hogy a kérdésre is válaszoljak, attól függ, hogy mit és hogyan akarsz összehasonlítani. Pl. két fájl esetén ahhoz, hogy abból hash-t képezz, minden bájtján végig kell menni, és bájtonként több műveletet elvégezni. Ennél kisebb számítási kapacitást jelent, ha párhuzamosan mennél a két fájlon, és bájtonként összehasonlítanád (az egy ciklusváltozó növelés és egy összehasonlítás kb.). Tehát két fájl esetén gyorsabb a klasszikus módon összehasonlítani. Egyrészt ugye lehet a fájlméretet is összehasonlítani előtte, ez a legtöbb esetben – hacsak nem valami speciális tartalmú fájlról van szó – eleve nem fog egyezni. Ha a 3. bájtban találsz eltérést, akkor el is dőlt a dolog, nem kell a többi bájtot összehasonlítani, hiszen tudjuk, hogy eltérnek.


Megint más a helyzet, ha nem csak két fájlt kell összehasonlítani. Pl. mondjuk van egy weboldalad, azon van több ezer kép. Te azt akarod ellenőrizni, hogy az a kép már fel van-e töltve. Na akkor nem két fájlt kell összehasonlítanod, hanem a feltöltött fájlt az összes már a szerveren lévő fájllal, ami több ezer összehasonlítás. Oké, a fájlméretek miatt, lehet, hogy ténylegesen csak néhány összehasonlításról van szó, de pl. te le tudod tárolni a feltöltött képek hash-ét, akkor csak generálni kell az új fájlnak egy hasht, és azt összehasonlítani a többi fájl tárolt hash-ével. Ha adatbázisban tárolod a hash-eket, akkor ráadásul a megnyitott fájlok száma, a merevlemez terhelése is erősen csökkenni tud. De néhány ezer fájlnál még beleférhet a fájlméret összehasonlítás, és annak egyezése esetén a tartalom összehasonlítása is, hiszen az általában azért az első néhány bájtnál már különbséget fog mutatni.


Megint más a helyzet, ha egyező méretű fájlokról van szó, mondjuk fix méretű bmp-ket kell összehasonlítani. Ott már biztos, hogy megéri hash-t összehasonlítani.


Az átviteli közeg sem lényegtelen. Nem véletlenül szokták használni fájlletöltésnél a hash-eket. Oké, letöltöttél egy fájlt. Most ellenőrizni kellene, hogy minden bájtját jól töltötte-e le. Ehhez kvázi újra le kellene tölteni, ami nem mindegy. Ehelyett elég lokálisan generálni egy hash-t a letöltött tartalomról, és megnézni, hogy a távol tárolt hash egyezik-e vele.

2015. okt. 10. 20:17
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!