什麼是 MD5 ?
MD5(Message Digest Algorithm,資訊摘要演算法),一種被廣泛使用的密碼雜湊函數,可以產生一個128位元(16位元組)的雜湊值(hash value),用於確保訊息傳輸完整一致。它後面這個數字 5 是因為它是為了取代 MD4 而發明的。 簡單的理解,它的作用就是給文件一個唯一標識。 如果我們修改了一個檔案的副檔名,檔案可能會打不開,但對於 MD5 來說,並沒有什麼改變。所以對於一個文件,進行任何的重新命名對於md5校驗都是沒有用的。
MD5 的應用
這裡只提幾點我見過的比較頻繁的應用。
下載檔案校驗
因為網路並不是完美的,下載大檔案的過程中可能會出錯(小檔案也會,但是通常越大的檔案幾率越大),這是很正常的現象,網路出現波動是很正常的。所以,通常有些軟體的jar或開發工具會額外提供一個檔案的md5值下載(因為它很小,通常認為是不會出錯的),用於用戶校驗檔案是否下載錯誤。但是現在網路也是越來越好了,基本上不會錯。因此,如果使用者的網路狀況較差,下載後務必進行校驗以防出錯。 )
上傳檔案
相較之下,md5值上傳檔案的應用程式範圍就更大了。這裡主要的用途是為了檔案去重和檔案過濾。
檔案去重
我們知道用戶上傳的檔案中,一般都是有很多重複的,如最近流行的電影、電視劇、遊戲或其它的流行資源。其實它們佔據了使用者上傳檔案的很大一部分,所以對於同一份資源,只需要儲存一份就可以了。試想一下,一萬個用戶(一萬可能都少了)上傳了同一份 4GB 的電影,那麼總共需要磁碟容量:4*10000 GB。如果只是上傳一份,對於其它用戶的上傳只是在本地計算文件的md5值,如果相同就認為是同一個文件,那麼就只需要4GB 空間就足夠了(當然,這裡忽略了記錄信息的空間大小,但是相比於文件本身的大小,這些資訊還是很小的)。大家可以想一下,這樣對於空間的節約是多麼巨大的。
大家生活中,應該經常用到,上傳一個幾個GB 的大文件,居然幾秒鐘就完成了,但是稍微有點網絡知識的都知道,網絡的上傳速率是小於下載速率的(這只是對終端使用者來說),下載都達不到的速度,上傳更是不可能的。所以,它應該只是進行了一個檔案md5值的計算過程,根據計算的結果,如果有就不上傳,只是記錄一下使用者擁有這個檔案而已。如果沒有的話,就老實上傳,當然了,這個過程通常很慢。
檔案過濾
有一些檔案涉及到版權和政策的關係,是不允許使用者上傳的。所以,對於用戶上傳檔案也會進行校驗,然後和後台的黑名單匹配(應該是這樣的),如果匹配成功的話,那麼文件是無法上傳或上傳的文件已經被處理掉了。這樣方法的效率很高的,通常使用者所謂的亂改名操作是完全沒有用的。 所以,使用者一定要遵守政策和相關平台的規定。
修改檔案的 MD5 值
一般情況下,只要改變了檔案的二進位內容,檔案的md5值一定會改變的。通常有利用壓縮檔案的方式,將多個檔案壓縮上傳的方式,這樣壓縮檔案的 md5值也會改變,但是有的平台也是可以解壓縮檔案的,所以這樣也不是萬能的。但是透過程式修改和還原檔案的二進位資料還是比較容易地,使用Java的流幾乎可以對與檔案進行任何操作(例如對於檔案的每個位元組進行加密,這樣想還原這個檔案就是很難的,或者只是加密一段或先建立一個文件,先向文件寫入一段固定的數字,再寫入相關文件的數據,這樣也是很不錯的方法。)。對於文件來說,我們可以簡單地把它看出是一連串連續地二進位流(邏輯上),將它合併(增加)或者截斷(減少)是很簡單地操作,這裡就是簡單的涉及文件和IO流的知識了。
一個簡單的計算md5 的程式
這個程式是Java網路程式設計上面的,這裡去掉了線程,簡化了一下操作,反正只是用來計算md5值,不需要使用者的其它操作。
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.security.DigestInputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.xml.bind.DatatypeConverter; public class TestMD5 { public static void main(String[] args){ for (String filepath : args) { String md5 = computeMD5(new File(filepath)); System.out.println(md5); } } private static String computeMD5(File file) { DigestInputStream din = null; try { MessageDigest md5 = MessageDigest.getInstance("MD5"); //第一个参数是一个输入流 din = new DigestInputStream(new BufferedInputStream(new FileInputStream(file)), md5); byte[] b = new byte[1024]; while (din.read(b) != -1); byte[] digest = md5.digest(); StringBuilder result = new StringBuilder(file.getName()); result.append(": "); result.append(DatatypeConverter.printHexBinary(digest)); return result.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (din != null) { din.close(); } } catch (IOException e) { e.printStackTrace(); } } return null; } }
運行結果
修改MD5 值
這裡有兩個圖片,對它們合併,注意我這裡的合併,不是通常所說的文件合併(例如合成九宮格圖片),而是將文件的二進位資料合併。
先計算檔案的md5 值,注意下面的Ahusky.jpeg 是上面的husky.jpeg 的重命名,可以看出來對於md5值來說並沒有變化,所以這是同一個文件。
然後將檔案合併。
計算合併後檔案的 md5 值
##
以上是怎麼使用Java計算修改文件的MD5值的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載
最受歡迎的的開源編輯器