2012-05-24 9 views
25

Se faccio:md5 (file_contents_as_string) equivale a md5_file (/ percorso/a/file)?

<?php echo md5(file_get_contents("/path/to/file")) ?>

... sarà questo produrrà sempre lo stesso hash come:

<?php echo md5_file("/path/to/file") ?>

+5

Hm, non si può dire con certezza, ma se il file contiene un [byte order mark] (http://en.wikipedia.org/wiki/Byte_order_mark) e la stringa non lo fa, gli hash non saranno pari. – vcsjones

+4

[in risposta al commento eliminato] Potrei provarlo da solo. Sono solo preoccupato che se ottengo una corrispondenza e inizio a confrontare md5() con md5_file() potrebbero esserci problemi lungo la linea che producono diversi hash - forse a che fare con le direttive php_ini o qualcosa del genere sopra la mia testa che essere un incubo per eseguire il debug/identificare. – Tom

risposta

25

Sì, lo restituiscono lo stesso:

var_dump(md5(file_get_contents(__FILE__))); 
var_dump(md5_file(__FILE__)); 

che restituisce questo nel mio caso:

string(32) "4d2aec3ae83694513cb9bde0617deeea" 
string(32) "4d2aec3ae83694513cb9bde0617deeea" 

Edit: Date un'occhiata al codice sorgente di entrambe le funzioni: https://github.com/php/php-src/blob/master/ext/standard/md5.c (Linea 47 & 76). Entrambi utilizzano le stesse funzioni per generare l'hash, tranne per il fatto che la funzione md5_file() apre prima il file.

2nd Edit: In genere la funzione md5_file() genera l'hash basato sul contenuto del file, non sui metadati del file come il nome file. Questo è lo stesso modo in cui funziona lo md5sum sui sistemi Linux. Vedere questo esempio:

[email protected]:~# echo foobar > foo.txt 
[email protected]:~# md5sum foo.txt 
14758f1afd44c09b7992073ccf00b43d foo.txt 
[email protected]:~# mv foo.txt bar.txt 
[email protected]:~# md5sum bar.txt 
14758f1afd44c09b7992073ccf00b43d bar.txt 
3

md5_file comando appena hashs il contenuti di un file con MD5.

Se si fa riferimento al vecchio implementazione md5_file PHP (ma il principio è sempre lo stesso) source:

function php_compat_md5_file($filename, $raw_output = false) 
{ 
// ... 
// removed protections 

if ($fsize = @filesize($filename)) { 
     $data = fread($fh, $fsize); 
    } else { 
     $data = ''; 
     while (!feof($fh)) { 
      $data .= fread($fh, 8192); 
     } 
    } 

    fclose($fh); 

    // Return 
    $data = md5($data); 
    if ($raw_output === true) { 
     $data = pack('H*', $data); 
    } 

    return $data; 
} 

Quindi, se si hash con md5 qualsiasi stringa o il contenuto, si sarà sempre ottenere lo stesso risultato md5_file (per la stessa codifica e il contenuto del file).

In tal caso, se si hash MD5 il contenuto di un file con file_get_content() o se si utilizza md5_file o anche se si utilizza md5 comando con lo stesso contenuto come contenuto del file, sarà sempre ottenere lo stesso risultato.

con l'esempio, si potrebbe cambiare il nome di un file, e per due file diversi, con lo stesso contenuto, produrranno lo stesso hash MD5.

By esempio: Considerando due file contenenti "StackOverflow" (senza le virgolette) denominato 1.txt e 2.txt

md5_file("1.txt"); 
md5_file("2.txt"); 

sarebbe uscita

73868cb1848a216984dca1b6b0ee37bc 

si avrà la stessa identica risultato se si md5("stackoverflow") o se si md5(file_get_contents("1.txt")) o md5(file_get_contents("1.txt")).

+0

La fonte a cui ti riferisci è una vecchia implementazione PHP della funzione. Ma la spiegazione è buona. – prehfeldt

+0

Hai il nuovo link? Non ho un accesso gratuito a internet e così tanti siti web sono bloccati qui. Se hai la nuova fonte, aggiornerò il mio post. –

+0

@ pier-alexandre-bouchard ha pubblicato un link al codice sorgente php in questione nella sua risposta. :) – damianb

2

Sì, l'ho provato per diversi volte. Nel mio caso, i risultati per:

<?php echo md5(file_get_contents("1.php")) ?> 
<br/> 
<?php echo md5_file("1.php") ?> 

Produrre un risultato come:

660d4e394937c10cd1c16a98f44457c2 
660d4e394937c10cd1c16a98f44457c2 

Che sembra equivalente su entrambe le linee.

3

in base al contenuto del file, non sui metadati di file come la distinta o nome del file

Questo non è corretto su BOM. BOM è una parte del contenuto del file, è possibile vedere i suoi tre byte in qualsiasi editor di file non Unicode.

+2

Questo dovrebbe essere un commento sulla risposta da cui proviene la tua citazione, non una risposta a sé stante. – BHSPitMonkey