目錄
什麼是 MD5 ?
MD5 的應用
下載檔案校驗
上傳檔案
檔案去重
檔案過濾
修改檔案的 MD5 值
一個簡單的計算md5 的程式
修改MD5 值
首頁 Java java教程 怎麼使用Java計算修改文件的MD5值

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

May 29, 2023 am 08:16 AM
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

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java 中的完美數 Java 中的完美數 Aug 30, 2024 pm 04:28 PM

Java 完美數指南。這裡我們討論定義,如何在 Java 中檢查完美數?

Java 中的隨機數產生器 Java 中的隨機數產生器 Aug 30, 2024 pm 04:27 PM

Java 隨機數產生器指南。在這裡,我們透過範例討論 Java 中的函數,並透過範例討論兩個不同的生成器。

Java中的Weka Java中的Weka Aug 30, 2024 pm 04:28 PM

Java 版 Weka 指南。這裡我們透過範例討論簡介、如何使用 weka java、平台類型和優點。

Java 中的史密斯數 Java 中的史密斯數 Aug 30, 2024 pm 04:28 PM

Java 史密斯數指南。這裡我們討論定義,如何在Java中檢查史密斯號?帶有程式碼實現的範例。

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

在本文中,我們保留了最常被問到的 Java Spring 面試問題及其詳細答案。這樣你就可以順利通過面試。

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

Java 中的時間戳至今 Java 中的時間戳至今 Aug 30, 2024 pm 04:28 PM

Java 中的時間戳記到日期指南。這裡我們也結合範例討論了介紹以及如何在java中將時間戳記轉換為日期。

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

See all articles