ugrás a tartalomhoz

MD5 utkozes fajl feltolteskor

Anonymous · 2006. Aug. 25. (P), 14.44
Fajlokat akarok feltolteni egy folderbe a szerveren.
Egyedi MD5 hasht akarok letrehozni minden fajlnak, ezek a hashok nem utkozhetnek soha!

Letrehoztam a kovetkezot, hogy tudjam szimulalni a dolgot:

   for( $i = 0; $i < 5; $i++ )
       echo 'Time: '.time().' ID: '.substr(md5(uniqid(time())), 0, 10)."\n<br />";
A kovetkezot eredmenyt kapom:

Time: 1156509593 ID: d52b34af94
Time: 1156509593 ID: 80f3b4ceef
Time: 1156509593 ID: f293dd93a4
Time: 1156509593 ID: c9133e1485
Time: 1156509593 ID: 3763b3796c 
Eddig minden ok. De ez meg nem akadalyoza meg az utkozest. Kicsi a valoszinuseg de elofordulhat, hogy egyforma MD5 alakul ki, adok meg egy peldat:

   for( $i = 0; $i < 5; $i++ )
       echo 'Time: '.time().' ID: '.substr(md5(uniqid(time())), 0, 1)."\n<br />";
Most bekovetkezett az utkozes:

Time: 1156509712 ID: 3
Time: 1156509712 ID: 8
Time: 1156509712 ID: 5
Time: 1156509712 ID: 9
Time: 1156509712 ID: 5 
10 karakteres MD5 hashnal kicsi az esely de megtortenhet. Ha ez pedig megtortenik mit lehet csinalni ?

Van valami lehetoseg, hogy amikor bekovetkezik az utkozes, az egyik MD5 hasht neveze at es rakjon mele valami karaktereket?

Koszonom !
 
1

md5

Anonymous · 2006. Aug. 25. (P), 16.11
Lehet hogy nem jól értem a kérdést...

Miért nem jó az md5 eredeti, 32 karakter hosszú string-je? Miért vágsz le belőle?

A másik az, hogy ha a file nevéből, és mondjuk egy timestamp-ből generálsz nevet, akkor szinte biztos hogy nem lesz két egyforma. Ha több file-t töltesz fel egyszerre, akkor még a ciklusváltozót is oda kell tenned a névbe.
$time=time();
for( $i = 0; $i < 5; $i++ ) {
       $nev=md5(($time+$i).$eredetinev[$i]);
}
Gyulus
2

ok

Anonymous · 2006. Aug. 25. (P), 18.17
Miért nem jó az md5 eredeti, 32 karakter hosszú string-je? Miért vágsz le belőle?


Nem szeretnem ha olyan hosszu lenne. Ez nem aktivacio kod regisztracio utan.

Ha csak timestampot generalok es egy felhasznalo ugyanaz a fajlt ugyanaban az idoben toli ugyanaz a hash generalodik.
3

pelda

Anonymous · 2006. Aug. 25. (P), 18.38
Itt van egy konkret pelda amirol beszelek, csak time hasznalata :


<?php
   for( $i = 0; $i < 5; $i++ )
       echo 'Time: '.time().' ID: '.substr(md5(time()), 0, 10)."\n<br />";
?>


Time: 1156523814 ID: b6891bb640
Time: 1156523814 ID: b6891bb640
Time: 1156523814 ID: b6891bb640
Time: 1156523814 ID: b6891bb640
Time: 1156523814 ID: b6891bb640 
4

szám

Anonymous · 2006. Aug. 25. (P), 20.06
Mi lenne, ha hozzácsapnál egy számot, ha létezik már olyan név? Tehát tomestamp, de mielőtt létrehozod file_exists. Ha létezik, akkor pl. 123456789_2.txt lesz a fájl.
De ugyanezt megcsinálhatod az MD5-nél is. Egyébként miért nem jó a 32 karakter? Olyan sok helyet foglalna még pár karakter a fájlnévben?
5

csak számok?

Anonymous · 2006. Aug. 25. (P), 20.18
Vagy mi lenne ha egészegyszerűen csak számokat használnál? (feltáve, ha az alkalamzazás megendegi) Gyorsabban számítható, mint az md5, és még ütközés sincs.
6

Nem hiszem, hogy bekövetkezik

csla · 2006. Aug. 25. (P), 20.31
Szerintem annak a valószínűsége, hogy azonos felhasználónévvel, azonos nevű file-t, ezredmásodpercre egyforma időpontban töltsenek fel, gyakorlatilag 0.
7

kosz

Anonymous · 2006. Aug. 26. (Szo), 10.05
Elegendo ha azonos nevu fajlt ugyanabban az idoben barmilyen felhasznalo feltolt.
A multkor lattam valami weblapon egy megoldast, a letezo hasht atnevezi. De sajnos elvesztettem a cimet, fogalmam sincs milyen figgvenyel tortent, stb..
9

ez pont nem az az eset

Anonymous · 2006. Aug. 26. (Szo), 14.43
Ne hát ez pont nem az az eset, amiről csla írt. Nem "bármilyen" felhasználóról, hanem "ugyanarról" volt szó: vagyis a megoldás igen egyszerű, egyértelmű: mivel regisztrált, egyedi userek vannak, az ő azonosítójukból+a dátum..ezredmp-ből kell azonosítót gyártani, és user legyen a talpán, aki 2 fájlt tölt fel 1 ezredmásodpercen belül. (Ugye erre gondoltál, csla?)
Nem kell vacakolni md5-tel, értelmetlen ebben a szituációban: ha a fájlnévre teszed rá, semmivel sem lesz egyedibb, mint maga a fájlnév, ha pedig le is vágsz belőle... Nevetséges. Az MD5 nem erre való.
8

ciklus

Anonymous · 2006. Aug. 26. (Szo), 10.59
Erre a problémára egyszer én is ráparáztam, pedig valójában tényleg rohadtul pici az ütközés valószínűsége. Na mindegy, szóval úgy oldottam meg, hogy egy nem túl nagy (kb, 20) 'for' ciklusba tettem a hash generálást. Amikor lefutott, akkor ellenőrizte, hogy nincs-e ütközés. Ha nem volt, akkor egy 'break'-kel kiléptem a ciklusból, ha igen, akkor meg generálódott másik (mivel szerepelt benne a 'microtime', ezért gyakorlatilag másodjára már egy teljesen másik hash generálódott le).
Egyébként tettem bele egy ellenőrzést, ami szól, ha ütközés van. De eddig még nem szólt, pedig már megy egy ideje :-)

-- hector
10

???

Bártházi András · 2006. Aug. 26. (Szo), 16.29
Nem tudom, mi a bajod a hosszú fájlnevekkel. De adj a fájloknak egy egyszerűen folyamatosan növő sorozatszámot, és kész. MySQL auto_increment, vagy PostgreSQL serial (azt hiszem, így hívják) a barátod.