搜尋
首頁Javajava教程怎麼使用Java計算修改文件的MD5值

什麼是 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;
	}
}

運行結果

怎麼使用Java計算修改文件的MD5值

修改MD5 值

這裡有兩個圖片,對它們合併,注意我這裡的合併,不是通常所說的文件合併(例如合成九宮格圖片),而是將文件的二進位資料合併。

怎麼使用Java計算修改文件的MD5值

先計算檔案的md5 值,注意下面的Ahusky.jpeg 是上面的husky.jpeg 的重命名,可以看出來對於md5值來說並沒有變化,所以這是同一個文件。

怎麼使用Java計算修改文件的MD5值

然後將檔案合併。

怎麼使用Java計算修改文件的MD5值

計算合併後檔案的 md5 值

怎麼使用Java計算修改文件的MD5值##

以上是怎麼使用Java計算修改文件的MD5值的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?Mar 17, 2025 pm 05:46 PM

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

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?Mar 17, 2025 pm 05:45 PM

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

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?Mar 17, 2025 pm 05:44 PM

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

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?Mar 17, 2025 pm 05:43 PM

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

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Mar 17, 2025 pm 05:35 PM

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

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

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

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

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

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器