在PHP项目中,我们经常需要在读取文件之后对其内容做完整性校验,最常见的方式就是计算文件的MD5哈希值。无论是用户上传文件防篡改,还是本地文件比对,掌握PHP获取文件哈希值的方法都很实用。

一、使用md5_file直接计算文件MD5
PHP内置了md5_file()函数,它可以直接读取文件路径并返回该文件的MD5值,不需要我们手动打开文件。这是最简单也最常用的方式。
<?php
// 文件路径
$filePath = '/var/www/uploads/demo.zip';
// 判断文件是否存在
if (file_exists($filePath)) {
// 直接计算文件MD5值
$md5Hash = md5_file($filePath);
echo '文件MD5值为:' . $md5Hash;
} else {
echo '文件不存在';
}
?>
这种方式适合中小文件,因为函数内部会一次性读取文件内容。
二、分块读取大文件计算MD5
当文件很大时,使用md5_file()可能占用较多内存。我们可以通过分块读取并使用hash_init()、hash_update()和hash_final()来流式计算。
<?php
$filePath = '/var/www/uploads/bigfile.iso';
$chunkSize = 8192; // 每次读取8KB
// 初始化MD5哈希上下文
$ctx = hash_init('md5');
// 以二进制只读方式打开文件
$fp = fopen($filePath, 'rb');
if ($fp) {
while (!feof($fp)) {
$data = fread($fp, $chunkSize);
// 更新哈希上下文
hash_update($ctx, $data);
}
fclose($fp);
// 输出最终哈希值
$fileMd5 = hash_final($ctx);
echo '大文件MD5:' . $fileMd5;
}
?>
三、读取内容后计算字符串MD5
如果已经通过file_get_contents()把文件读成了字符串,也可以用md5()函数计算哈希。
<?php
$content = file_get_contents('/var/www/config.json');
$hash = md5($content);
echo '内容MD5:' . $hash;
?>
四、文件哈希校验对比表
| 方法 | 适用场景 | 内存占用 |
|---|---|---|
| md5_file() | 中小文件直接校验 | 较高 |
| hash流式分块 | 大文件或内存受限环境 | 低 |
| md5(file_get_contents()) | 已读取内容需校验 | 高 |
五、小结
PHP读取文件后计算MD5值并不复杂,关键是根据文件大小选择合适的方法。日常小文件推荐直接用md5_file(),大文件建议使用hash_init相关函数分块处理,这样既能完成文件哈希校验,也能保证程序稳定运行。