2012-05-24 18 views
25

Si hago:¿Será igual a md5 (file_contents_as_string) md5_file (/ path/to/file)?

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

... esto siempre va a producir el mismo hash que:

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

+5

Hm, no puedo decirlo con certeza, pero si el archivo contiene una [marca de orden de bytes] (http://en.wikipedia.org/wiki/Byte_order_mark) y la cadena no aparece, los valores hash no serán igual. – vcsjones

+4

[en respuesta a un comentario eliminado] Podría probarlo yo mismo. Solo me preocupa que si encuentro una coincidencia y empiezo a comparar md5() con md5_file(), pueda haber problemas en la línea que produzcan hashes diferentes, tal vez para hacer con las directivas php_ini o algo así sobre mi cabeza que pueda ser una pesadilla para depurar/identificar. – Tom

Respuesta

25

Sí que producen el mismo resultado:

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

cuales devuelve esto en mi caso:

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

Editar: Tome un vistazo al código fuente de ambas funciones: https://github.com/php/php-src/blob/master/ext/standard/md5.c (Línea 47 & 76). Ambos usan las mismas funciones para generar el hash, excepto que la función md5_file() abre primero el archivo.

2nd Edit: Básicamente, la función md5_file() genera el hash basado en el contenido del archivo, no en los metadatos del archivo como el nombre del archivo. Esta es la misma manera que md5sum en sistemas Linux. Vea este ejemplo:

comando
[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 simplemente hashs la contenido de un archivo con MD5.

Si se refiere a la antigua aplicación md5_file PHP (pero el principio sigue siendo el mismo) 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; 
} 

Así que si hash con md5 cualquier cadena o contenido, que siempre obtendrá el mismo resultado que md5_file (para la misma codificación y contenido de archivo).

En ese caso, si hash MD5 del contenido de un archivo con file_get_content() o si utiliza md5_file o incluso si se utiliza md5 comando con el mismo contenido que el contenido del archivo, siempre obtendrá el mismo resultado.

Por ejemplo, puede cambiar el nombre de archivo de un archivo, y para dos archivos diferentes, con el mismo contenido, producirán el mismo hash md5.

Por ejemplo: Teniendo en cuenta dos archivos que contienen "stackoverflow" (sin las comillas) y nombrado 1.txt 2.txt

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

habría salida

73868cb1848a216984dca1b6b0ee37bc 

Usted tendrá la misma exacta resultado si md5("stackoverflow") o si md5(file_get_contents("1.txt")) o md5(file_get_contents("1.txt")).

+0

La fuente a la que se refiere es una implementación de PHP antigua de la función. Pero la explicación es buena. – prehfeldt

+0

¿Tiene el nuevo enlace? No tengo acceso gratuito a internet y muchos sitios web están bloqueados aquí. Si tienes la nueva fuente, actualizaré mi publicación. –

+0

@ pier-alexandre-bouchard publicó un enlace al código fuente php en cuestión en su propia respuesta. :) – damianb

2

Sí, lo probé durante varios veces. En mi caso, pueden implicar para:

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

Producir una salida como:

660d4e394937c10cd1c16a98f44457c2 
660d4e394937c10cd1c16a98f44457c2 

Lo que parece equivalente en ambas líneas.

3

basado en el contenido del archivo, no en los metadatos de archivos como la lista de materiales o nombre de archivo

Eso no es correcta acerca de la lista de materiales. BOM es una parte del contenido del archivo, puede ver sus tres bytes en cualquier editor de archivos no unicode.

+2

Esto debería ser un comentario sobre la respuesta de la que proviene su cita, no una respuesta en sí misma. – BHSPitMonkey