2012-05-21 112 views
4

我目前正在研究一種上傳一組文件的工具,然後使用md5校驗和將文件與最後一批上傳的文件進行比較,並告訴您哪些文件已更改。zip文件的校驗和

對於普通文件,這工作正常,但一些上傳的文件是zip檔案,即使其中的文件是相同的,它幾乎總是變化。

有沒有辦法執行不同類型的校驗和來檢查這些文件是否發生了變化,而不必單獨解壓每個文件,然後逐個比較每個文件的內容。

這裏是我當前的功能

function check_if_changed($date, $folder, $filename) 
{ 
    $dh = opendir('./wp-content/uploads/Base/'); 
    while (($file = readdir($dh)) !== false) { 
    $folders[] = $file; 
    } 
    sort($folders); 
    $position = array_search($date, $folders); 
    $prev_folder = $folders[$position - 1]; 
    if ($prev_folder == '.' || $prev_folder == '..') 
    { return true;} 
    $newhash = md5_file('./wp-content/uploads/Base/'.$date.'/'.$folder.'/'.$filename); 
    $oldhash = md5_file('./wp-content/uploads/Base/'.$prev_folder.'/'.$folder.'/'.$filename); 
    if ($oldhash != $newhash){ 
    return true; 
    } 
    return false; 
} 

回答

5

在一個zip壓縮文件中,每個「文件」都與元數據一起存儲,如最後一次修改時間,文件名,文件大小等等,以及重要部分 - 一個crc32校驗和

基本上,您可以在二進制文件中以二進制方式操作,查找每個文件的元數據頭並將校驗和與先前存儲的校驗和進行比較。您無需進行任何解壓即可訪問zip存檔中的元數據。這將非常快速。

http://en.wikipedia.org/wiki/Zip_(file_format)

編輯 - 實際上,ZipArchive提供了這個功能。請參閱: http://www.php.net/manual/en/ziparchive.statindex.php

+0

OT:python zip庫允許您從zip文件中抓取crcs,您還可以使用binascii模塊爲任意任意數據計算它。 –

+0

看起來校驗和是'crc32b',它可以由'$ newCrc = hexdec(hash_file(「crc32b」,「myPath /」。$ name));'在64位機器上生成。 –

0

你可以只提取ZIP文件的文件部分,然後散列他們,但那麼你就必須刪除元信息,太!

所以提取文件是最簡單的解決方案。