2024 年 PHP 日本大会

md5_file

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

md5_file计算给定文件的 md5 散列值

描述

md5_file(字符串 $filename, 布尔值 $binary = false): 字符串|false

使用 » RSA 数据安全公司 MD5 消息摘要算法计算由 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 散列值

添加注释

用户贡献的注释 3 条注释

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

<?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;
}
?>
9
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
"Hash = ".$result[0]."<br />";

# 此处还有 7 个其他大型文件 (20-300 MB)

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

# 使用 openssl 的方法
# Time = 12.1463856900543
?>

大约快 3 倍
-5
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解决方案更快之前(例如,处理小型文本文件与电影等),您可能需要测试您自己的文件。
To Top