PHP 日本研討會 2024

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 訊息摘要演算法,計算由 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
"雜湊值 = ".$result[0]."<br />";

# 這裡還有 7 個其他大型檔案 (20-300 MB)

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

# 使用 openssl 的方法
# 時間 = 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