php string to hash
¿Md5(file_contents_as_string) será igual a md5_file(/ path/to/file)? (4)
basado en el contenido del archivo, no en los metadatos del archivo como la lista de materiales o el nombre de archivo
Eso no es correcto sobre BOM. BOM es una parte del contenido del archivo, puede ver sus tres bytes en cualquier editor de archivos que no sea Unicode.
Si lo hago:
<?php echo md5(file_get_contents("/path/to/file")) ?>
... esto siempre producirá el mismo hash que:
<?php echo md5_file("/path/to/file") ?>
Sí vuelven lo mismo:
var_dump(md5(file_get_contents(__FILE__)));
var_dump(md5_file(__FILE__));
que devuelve esto en mi caso:
string(32) "4d2aec3ae83694513cb9bde0617deeea"
string(32) "4d2aec3ae83694513cb9bde0617deeea"
Edición: Eche un vistazo al código fuente de ambas funciones: https://github.com/php/php-src/blob/master/ext/standard/md5.c (líneas 47 y 76). Ambos usan las mismas funciones para generar el hash, excepto que la función md5_file()
abre el archivo primero.
2ª Edición: 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 de archivo. Así es como funciona md5sum
en sistemas Linux. Vea este ejemplo:
pr@testumgebung:~# echo foobar > foo.txt
pr@testumgebung:~# md5sum foo.txt
14758f1afd44c09b7992073ccf00b43d foo.txt
pr@testumgebung:~# mv foo.txt bar.txt
pr@testumgebung:~# md5sum bar.txt
14758f1afd44c09b7992073ccf00b43d bar.txt
Sí, lo probé varias veces. En mi caso, resultado para:
<?php echo md5(file_get_contents("1.php")) ?>
<br/>
<?php echo md5_file("1.php") ?>
Producir salida como:
660d4e394937c10cd1c16a98f44457c2
660d4e394937c10cd1c16a98f44457c2
Lo que parece equivalente en ambas líneas.
md5_file
comando md5_file
solo contiene el contenido de un archivo con md5.
Si se refiere a la antigua implementación de PHP de md5_file (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;
}
Entonces, si hash con md5
cualquier cadena o contenido, siempre obtendrás el mismo resultado que md5_file
(para la misma codificación y contenido de archivo).
En ese caso, si hash por md5 el contenido de un archivo con file_get_content()
o si usa md5_file
o incluso si usa el comando md5
con el mismo contenido que el contenido de su 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: considerando dos archivos que contienen "" (sin las comillas) llamados 1.txt y 2.txt
md5_file("1.txt");
md5_file("2.txt");
saldría
73868cb1848a216984dca1b6b0ee37bc
Tendrá el mismo resultado exacto si md5("")
o si md5(file_get_contents("1.txt"))
o md5(file_get_contents("1.txt")).