md5(file_contents_as_string) 是否等于 md5_file(/path/to/file)?
如果我这样做:
<?php echo md5(file_get_contents("/path/to/file")) ?>
...这将始终产生与以下相同的哈希值:
<?php echo md5_file("/path/to/file") ?>
如果我这样做:
<?php echo md5(file_get_contents("/path/to/file")) ?>
...这将始终产生与以下相同的哈希值:
<?php echo md5_file("/path/to/file") ?>
是的,它们返回相同的:
var_dump(md5(file_get_contents(__FILE__)));
var_dump(md5_file(__FILE__));
在我的情况下,它返回这个:
string(32) "4d2aec3ae83694513cb9bde0617deeea"
string(32) "4d2aec3ae83694513cb9bde0617deeea"
编辑:看看这两个函数的源代码:https://github.com/php/php-src/blob/master/ext/standard/md5.c(第47行和第76行)。它们都使用相同的函数来生成哈希,只是函数首先打开文件。md5_file()
第二次编辑:基本上,该函数根据文件内容生成哈希值,而不是基于文件名等文件元数据。这与 Linux 系统的工作方式相同。请参阅此示例:md5_file()
md5sum
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
md5_file
命令只是用 md5 对文件的内容进行哈希处理。
如果你参考旧的md5_file PHP实现(但原理还是一样的)来源:
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;
}
因此,如果您使用任何字符串或内容进行哈希处理,则始终将获得与(对于相同的编码和文件内容)相同的结果。md5
md5_file
在这种情况下,如果通过 md5 对文件内容进行哈希处理,或者如果您使用或即使您使用与文件内容相同的内容的命令,也始终会得到相同的结果。file_get_content()
md5_file
md5
例如,您可以更改文件的文件名,对于两个内容相同的不同文件,它们将生成相同的 md5 哈希。
示例:考虑两个包含名为 1.txt 和 2 的“堆栈溢出”(不带引号)的文件.txt
md5_file("1.txt");
md5_file("2.txt");
将输出
73868cb1848a216984dca1b6b0ee37bc
如果您或如果您或md5("stackoverflow")
md5(file_get_contents("1.txt"))
md5(file_get_contents("1.txt")).