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") ?>
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") ?>
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
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")).
La fonte a cui ti riferisci è una vecchia implementazione PHP della funzione. Ma la spiegazione è buona. – prehfeldt
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. –
@ pier-alexandre-bouchard ha pubblicato un link al codice sorgente php in questione nella sua risposta. :) – damianb
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.
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.
Questo dovrebbe essere un commento sulla risposta da cui proviene la tua citazione, non una risposta a sé stante. – BHSPitMonkey
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
[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