md5_file

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

md5_file计算给定文件的 md5 哈希值

描述

md5_file(string $filename, bool $binary = false): string|false

使用 » RSA Data Security, Inc. MD5 Message-Digest Algorithm 计算 filename 参数指定的文件的 MD5 哈希值,并返回该哈希值。哈希值是一个 32 个字符的十六进制数字。

参数

filename

文件名

binary

true 时,返回长度为 16 的原始二进制格式的摘要。

返回值

成功时返回一个字符串,否则返回 false

示例

示例 #1 md5_file() 的用法示例

<?php
$file
= 'php-5.3.0alpha2-Win32-VC9-x64.zip';

echo
'MD5 文件哈希值为 ' . $file . ': ' . md5_file($file);
?>

参见

  • hash_file() - 使用给定文件的内容生成哈希值
  • hash_init() - 初始化一个增量哈希上下文
  • md5() - 计算字符串的 md5 哈希值

添加备注

用户贡献的备注 5 备注

Chris
14 年前
如果你只需要找出两个文件是否相同,比较文件哈希可能效率低下,尤其是在大型文件上。如果每个文件的第二个字节不同,则没有理由读取两个完整的文件并进行所有计算。如果你不需要将哈希值存储以供以后使用,则可能不需要计算哈希值只是为了比较文件。这可能快得多

<?php
define
('READ_LEN', 4096);

if(
files_identical('file1.txt', 'file2.txt'))
echo
'文件相同';
else
echo
'文件不同';

// 传递两个文件名
// 如果文件相同,则返回 TRUE,否则返回 FALSE
function files_identical($fn1, $fn2) {
if(
filetype($fn1) !== filetype($fn2))
return
FALSE;

if(
filesize($fn1) !== filesize($fn2))
return
FALSE;

if(!
$fp1 = fopen($fn1, 'rb'))
return
FALSE;

if(!
$fp2 = fopen($fn2, 'rb')) {
fclose($fp1);
return
FALSE;
}

$same = TRUE;
while (!
feof($fp1) and !feof($fp2))
if(
fread($fp1, READ_LEN) !== fread($fp2, READ_LEN)) {
$same = FALSE;
break;
}

if(
feof($fp1) !== feof($fp2))
$same = FALSE;

fclose($fp1);
fclose($fp2);

return
$same;
}
?>
lukasamd at gmail dot com
12 年前
使用 md5sum 比 openssl md5 更快

<?php
$begin
= microtime(true);

$file_path = '../backup_file1.tar.gz';
$result = explode(" ", exec("md5sum $file_path"));
echo
"哈希值为 = ".$result[0]."<br />";

# 这里还有 7 个其他大文件 (20-300 MB)

$end = microtime(true) - $begin;
echo
"时间 = $end";
# 时间 = 4.4475841522217

# 使用 openssl 的方法
# 时间 = 12.1463856900543
?>

快了大约 3 倍
smartin
16 年前
关于使用 exec 来提高性能的回复(2007 年 11 月 13 日的帖子),看起来性能取决于文件的大小。请查看下面使用原始帖子中相同脚本的结果。第一个哈希值使用 md5_file,第二个哈希值使用 openssl md5。

对于 1MB 文件
哈希值为 = df1555ec0c2d7fcad3a03770f9aa238a; 时间 = 0.005006
哈希值为 = df1555ec0c2d7fcad3a03770f9aa238a; 时间 = 0.01498

对于 2MB 文件

哈希值为 = 4387904830a4245a8ab767e5937d722c; 时间 = 0.010393
哈希值为 = 4387904830a4245a8ab767e5937d722c; 时间 = 0.016691

对于 10MB 文件

哈希值为 = b89f948e98f3a113dc13fdbd3bdb17ef; 时间 = 0.241907
哈希值为 = b89f948e98f3a113dc13fdbd3bdb17ef; 时间 = 0.037597

性能似乎与文件大小成正比变化。从之前的帖子的默认文件名 (.mov) 判断,他/她可能是在处理一个大型文件。这些只是快速测试,远非完美的基准测试,但你可能想测试自己的文件,然后再假设 openssl 解决方案更快(即,如果使用小文本文件与电影等进行比较)
potsed [at] gmail [dot] com
17 年前
这是一个为整个目录提供 md5 的函数。

function MD5_DIR($dir)
{
if (!is_dir($dir))
{
return false;
}

$filemd5s = array();
$d = dir($dir);

while (false !== ($entry = $d->read()))
{
if ($entry != '.' && $entry != '..')
{
if (is_dir($dir.'/'.$entry))
{
$filemd5s[] = MD5_DIR($dir.'/'.$entry);
}
else
{
$filemd5s[] = md5_file($dir.'/'.$entry);
}
}
}
$d->close();
return md5(implode('', $filemd5s));
}
richard at interlink dot com dot au
19 年前
对于那些使用 PHP 4 并想要输出“原始” 128 位哈希值的开发者,您只需将哈希值发送到 pack 函数,将其转换为原始输出即可。

例如
$filename="checkthisfile.bin";
$rawhash=pack("H*",md5_file($filename));
To Top