Avatar billede hoppe11 Nybegynder
20. september 2007 - 17:32 Der er 17 kommentarer og
1 løsning

identificere fil

hvordan kan man identificere om to filer er de samme, med størst mulig sandsynlighed?
Avatar billede w13 Novice
20. september 2007 - 17:36 #1
Du må nok ind og sammenligne indholdet, er jeg bange for.
Avatar billede barklund Nybegynder
20. september 2007 - 17:39 #2
Det kommer rigtig meget an på, hvad du mener. Mener du om to fil-navne peger på samme blok på harddisken. Eller om to filer indeholder de samme bytes. Eller om to filer indeholder samme information i forskellige formater?

Men hvis det er nummer 2 - om de indeholder samme bytes - så ville en MD5 af de to filer kunne laves ret hurtigt (altså i operativsystemet uden om php) og så kan disse sammenlignes. Det giver dig ret høj sandsynlighed.

Skal du være 100% sikker skal du dog sammenligne de komplette filer.

Er du på noget *nix-server kan du måske også bruge nogle eksterne programmer såsom diff, som lynhurtigt kan sammenligne og påpege forskelle mellem filer. Der findes garanteret noget tilsvarende til windows.
Avatar billede hoppe11 Nybegynder
20. september 2007 - 18:00 #3
Jeg har med nogle store filer at gøre på mit site og det kunne derfor være lækkert hvis jeg kunne slippe for at have dublikante filer :) Altså så jeg i min database bare kunne referere til en fil i stedet for flere
Avatar billede hoppe11 Nybegynder
20. september 2007 - 18:02 #4
Kan man ikke lave en hash af en form at selve dataen i filen og sammenligne dem?
Avatar billede w13 Novice
20. september 2007 - 18:20 #5
Jo, som barklund foreslog, kan du foretage en MD5 (Message Digest algorith 5), som er en hashing. Du kan bruge funktionen md5_file, ref.: http://de2.php.net/manual/da/function.md5-file.php
Avatar billede w13 Novice
20. september 2007 - 18:20 #6
(*Message Digest algorithm 5)
Avatar billede hoppe11 Nybegynder
20. september 2007 - 21:25 #7
men for at være helt sikker burde man så ikke lave mere end et hash?

der er vel en sandsynlighed for at man kan løbe ind i to hash'es som er ens men filerne forskellige?
Avatar billede htx98i17 Professor
20. september 2007 - 21:48 #8
barklund -> hvordan kunne et ekspempel se ud ved at bruge diff som eksternt program?
<? exec(diff()); ?>

ved godt det ikke er mit spørgsmål, håber det er OK...
Avatar billede barklund Nybegynder
21. september 2007 - 10:09 #9
>> htx98i17
"diff -q" giver output, hvis filerne er forskellige og er ellers lydløs, hvis de er ens:

if (`diff -q fila.txt filb.txt` != "") {
  // forskellige!
} else {
  // ens!
}

Hurtigt eksempel:

$ echo foo > 1.txt
$ echo foo > 2.txt
$ diff -q 1.txt 2.txt
$ echo foo1 > 3.txt
$ diff -q 1.txt 3.txt
Files 1.txt and 3.txt differ
$ php -r 'if (`diff -q 1.txt 2.txt` != "") die("forskel\n"); else die("ens\n");'
ens
$ php -r 'if (`diff -q 3.txt 2.txt` != "") die("forskel\n"); else die("ens\n");'
forskel

Med PHP-CLI, men det giver samme anvendelse gennem en webserver selvfølgelig :)

>> hoppe11
MD5-hashes er nær-uniformt fordelt i deres 2^128 bit udfaldsrum, så vi kan godt sige, at sandsynligheden for en kollision er 1/2^128 (2,94e-39). Hvis du så har 1 milliard filer og der bliver tilføjet en ny, så er sandsynligheden for, at der allerede er en fil med samme hash altså 10^9/2^128 - 2,94e-30. Det er bestemt ikke noget, du behøver bekymre dig om :)
Avatar billede hoppe11 Nybegynder
21. september 2007 - 12:42 #10
htx98i17 > Det er helt fint, jeg fik mit svar

barklund > Smid et svar og tak for hjælpen :)
Avatar billede hoppe11 Nybegynder
21. september 2007 - 12:43 #11
barklund > dog kunne man jo gemme filstørrelsen som en int - bare for en sikkerhedsskyld :)
Avatar billede barklund Nybegynder
21. september 2007 - 13:03 #12
hoppe11, det kunne man selvfølgelig, men jeg ville nu nok vurdere, at det var så ligegyldigt, at man lige så godt kunne lade være :)
Avatar billede barklund Nybegynder
21. september 2007 - 13:06 #13
Altså, hvis vi forestiller os, at du fra i dag uploader en fil hvert millisekund, så vil der gå over 5 år før sandsynligheden for en kollision overstiger 50% (lidt voldtægt på sandsynlighedsregning, i know) :)
Avatar billede htx98i17 Professor
21. september 2007 - 13:11 #14
barklund -> Tak for dit svar. Det sparede mig lige for mange timers skruplen...
Avatar billede htx98i17 Professor
21. september 2007 - 13:16 #15
hvad præcis går den ind og sammenligner?
jeg sammenligner 2 filer som

if (`diff -q fila.txt filb.txt` != "") {
  // forskellige!
} else {
  // ens!
}

siger er forskellig.

Men åbner jeg de 2 filer i ultraedit og bruger funktionen compare files, så viser den ikke en eneste forskellighed?
Avatar billede barklund Nybegynder
21. september 2007 - 13:23 #16
Se manualen for diff: http://www-md.fsl.noaa.gov/localdev/diff.html

Du kan jo også manuelt på serveren køre:

diff fila.txt filb.txt

Eller i php kalde diff uden -q og se, hvad den outputter - så fortæller den dig netop den præcise forskel.

--
Morten Barklund
Avatar billede barklund Nybegynder
21. september 2007 - 14:13 #17
Tark for points :)
Avatar billede hoppe11 Nybegynder
21. september 2007 - 14:34 #18
sæl ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester