如果我这样做:
```php ```
...是否总会产生与以下代码相同的哈希值?
```php ```
```php ```
...是否总会产生与以下代码相同的哈希值?
```php ```
是的,它们返回相同的结果:
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()
函数首先打开文件。
第二次编辑:
基本上,md5_file()
函数根据文件内容生成哈希值,而不是根据文件元数据(比如文件名)。这与Linux系统上的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
相同的结果。file_get_content()
对文件内容进行md5哈希,或者使用md5_file
甚至是使用与文件内容相同的内容进行md5
命令,你总会得到相同的结果。md5_file("1.txt");
md5_file("2.txt");
将输出
73868cb1848a216984dca1b6b0ee37bc
如果你执行md5("stackoverflow")
或者是md5(file_get_contents("1.txt"))
或者是md5(file_get_contents("1.txt"))
,都会得到完全相同的结果。
是的,我已经尝试过几次了。
在我的情况下,结果为:
<?php echo md5(file_get_contents("1.php")) ?>
<br/>
<?php echo md5_file("1.php") ?>
660d4e394937c10cd1c16a98f44457c2
660d4e394937c10cd1c16a98f44457c2
这在两行上看起来是等价的。