超大檔案如何計算md5?

來源:互聯網
上載者:User

回複內容:

首先,至少沒必要先把整個檔案讀到記憶體裡。比如在 php 裡,如果有人 md5(file_get_contents(big_file_name)) 就確實非常不妥當。

因為 md5 是每 512 bit 作為一個 chunk 進行計算的。所以可以每次讀取一部分的內容(最少 512 bit,比較合適是 st_blksize),進行那些 chunk 部分的計算,之後再讀取下一部分內容繼續計算。MD5演算法本身是分塊的,其他很多類似的演算法比如SHA-1也是的,所以可以支援流式計算,讀一塊算一塊,最後再一次性產生完整hash,完全沒有記憶體爆炸的可能。
大多數語言都會提供流式的HashAlgorithm的API的,php也提供了md5_file,而且查文檔看它內部是流式的。我之前的做法是取每100m的前1m作md5.然後整體再md5一次。感覺也是蠻萌的。時間少花了很多,暫時還未碰撞過。簡單先說下,md5是有規範的,提供了現成的演算法(規範的名字就是md5演算法。RFC 1321 The MD5 Message-Digest Algorithm),我們只需要翻譯成c、java、python、js等等代碼。


代碼建議從網上找,沒必要造輪子。


另外,下載個校正器,測試下代碼正確性,之前踩過坑。。


http://www.freesoft.org/CIE/RFC/1321/ 據我猜測 各大網盤 TB層級 md5演算法應該是這樣的,樓上幾位都說了檔案md5是檔案流分塊算出來的,那麼網盤想獲得TB層級檔案的md5就必須讀取整個檔案的檔案流才能得到,但是這麼做效率十分低下,運算時間是個問題。但是大家忽略了一個問題,檔案在上傳的過程也是分塊上傳的,這些上傳的片段其實也是檔案流。那麼可以把計算md5的時間分攤到每一個片段上。這樣每上傳一個片段就計算一點等上傳完成了,檔案的md5也就算出來了。okTB層級MD5不是問題了。上傳完成md5自然就出來了。 不知道我的猜測大家有其他看法沒有。

剛才有仁兄提出都傳完了就還怎麼秒傳。秒傳最基本的是先要前端算出md5然後傳給後端(可能需要更多種雜湊值)我研究了很久前端沒有辦法秒內完成超大檔案MD5的,現在用html5 的api 可以算出任意大小檔案的 md5 但是耗時相當長。我沒有解決辦法。也沒有想到那些網盤怎麼在前端快速擷取md5的。 有想方法或者感興趣的可以加我QQ 122138299一起研究一下。最近正在做斷點續傳 和秒傳的項目。頭、中、尾各取一段1M的資料來取md5。


上面是開玩笑,正確的答案是,沒什麼好辦法,還是常規md5+緩衝吧。如果對一個1G大小的檔案做md5,耗時是大概是什麼層級的http://www.atool.org/file_hash.php js寫的檔案hash,看他的代碼,你就知道怎麼計算大檔案md5了…
肯定不是一次讀進來,不然瀏覽器爛爆了…這個問題其實可以參考各大網盤是怎麼做的
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.