欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何使用Java計(jì)算修改文件的MD5值

 更新時(shí)間:2023年04月08日 16:24:40   作者:CrazyDragon_King  
這篇文章主要介紹了如何使用Java計(jì)算修改文件的MD5值,MD5是一種被廣泛使用的密碼散列函數(shù),可以產(chǎn)生出一個(gè)128位(16字節(jié))的散列值,用于確保信息傳輸完整一致,需要的朋友可以參考下

什么是 MD5 ?

MD5(Message Digest Algorithm,信息摘要算法),一種被廣泛使用的密碼散列函數(shù),可以產(chǎn)生出一個(gè)128位(16字節(jié))的散列值(hash value),用于確保信息傳輸完整一致。它后面這個(gè)數(shù)字 5 是因?yàn)樗菫榱巳〈?MD4 而發(fā)明的。簡(jiǎn)單的理解,它的作用就是給文件一個(gè)唯一標(biāo)識(shí)。 如果我們修改了一個(gè)文件的擴(kuò)展名,文件可能會(huì)打不開,但是對(duì)于 MD5 來(lái)說(shuō),并沒有什么改變。所以對(duì)于一個(gè)文件,進(jìn)行任何的重新命名對(duì)于md5校驗(yàn)都是沒有用的。

MD5 的應(yīng)用

這里只提幾點(diǎn)我見過(guò)的比較頻繁的應(yīng)用情況。

下載文件校驗(yàn)

因?yàn)榫W(wǎng)絡(luò)并不是完美的,下載大文件的過(guò)程中可能會(huì)出錯(cuò)(小文件也會(huì),但是通常越大的文件幾率越大),這是很正常的現(xiàn)象,網(wǎng)絡(luò)出現(xiàn)波動(dòng)是很正常的。所以,通常有些軟件的jar或開發(fā)工具會(huì)額外提供一個(gè)文件的md5值下載(因?yàn)樗苄?,通常認(rèn)為是不會(huì)出錯(cuò)的),用于用戶校驗(yàn)文件是否下載錯(cuò)誤。但是現(xiàn)在網(wǎng)絡(luò)也是越來(lái)越好了,基本上不會(huì)錯(cuò)誤。(所以我沒有使用過(guò),如果用戶的網(wǎng)絡(luò)環(huán)境不是很好,下載完畢一定要校驗(yàn)一下,免得出錯(cuò)。)

上傳文件

相比之下,md5值上傳文件的應(yīng)用范圍就更大了。這里主要的用途是為了文件去重和文件過(guò)濾。

文件去重

我們知道用戶上傳的文件中,一般都是有很多重復(fù)的,如最近流行的電影、電視劇、游戲或者其它的流行資源。其實(shí)它們占據(jù)了用戶上傳文件的很大一部分,所以對(duì)于同一份資源,只需要存儲(chǔ)一份就可以了。試想一下,一萬(wàn)個(gè)用戶(一萬(wàn)可能都少了)上傳了同一份 4GB 的電影,那么總共需要磁盤容量:4*10000 GB。如果只是上傳一份,對(duì)于其它用戶的上傳只是在本地計(jì)算文件的 md5值 ,如果相同就認(rèn)為是同一個(gè)文件,那么就只需要 4GB 空間就足夠了(當(dāng)然,這里忽略了記錄信息的空間大小,但是相比于文件本身的大小,這些信息還是很小的)。大家可以想一下,這樣對(duì)于空間的節(jié)約是多么巨大的。
大家生活中,應(yīng)該經(jīng)常用到,上傳一個(gè)幾個(gè) GB 的大文件,居然幾秒鐘就完成了,但是稍微有點(diǎn)網(wǎng)絡(luò)知識(shí)的都知道,網(wǎng)絡(luò)的上傳速率是小于下載速率的(這只是對(duì)于終端用戶來(lái)說(shuō)),下載都達(dá)不到的速度,上傳更是不可能的。所以,它應(yīng)該只是進(jìn)行了一個(gè)文件md5值的計(jì)算過(guò)程,根據(jù)計(jì)算的結(jié)果,如果有就不上傳,只是記錄一下用戶擁有這個(gè)文件而已。如果沒有的話,就老老實(shí)實(shí)上傳,當(dāng)然了,這個(gè)過(guò)程通常很慢。

文件過(guò)濾

有一些文件涉及到版權(quán)和政策的關(guān)系,是不允許用戶上傳的。所以,對(duì)于用戶上傳文件也會(huì)進(jìn)行校驗(yàn),然后和后臺(tái)的黑名單匹配(應(yīng)該是這樣的),如果匹配成功的話,那么文件是無(wú)法上傳或者上傳的文件已經(jīng)被處理掉了。這樣方法的效率很高的,通常用戶所謂的亂改名操作是完全沒有用的。所以,用戶一定要遵守政策和相關(guān)平臺(tái)的規(guī)定。

修改文件的 MD5 值

一般情況下,只要改變了文件的二進(jìn)制內(nèi)容,文件的md5值一定會(huì)改變的。通常有利用壓縮文件的方式,將多個(gè)文件壓縮上傳的方式,這樣壓縮文件的 md5值也會(huì)改變,但是有的平臺(tái)也是可以解壓文件的,所以這樣也不是萬(wàn)能的。但是通過(guò)程序修改和還原文件的二進(jìn)制數(shù)據(jù)還是比較容易地,使用Java的流幾乎可以對(duì)與文件進(jìn)行任何操作(例如對(duì)于文件的每個(gè)字節(jié)進(jìn)行加密,這樣想還原這個(gè)文件就是很難的,或者只是加密一段或者首先創(chuàng)建一個(gè)文件,先向文件寫入一段固定的數(shù)字,再寫入相關(guān)文件的數(shù)據(jù),這樣也是很不錯(cuò)的方法。)。對(duì)于文件來(lái)說(shuō),我們可以簡(jiǎn)單地把它看出是一連串連續(xù)地二進(jìn)制流(邏輯上),將它合并(增加)或者截?cái)啵p少)是很簡(jiǎn)單地操作,這里就是簡(jiǎn)單的涉及文件 和 IO流的知識(shí)了。

我上次寫了一個(gè)關(guān)于文件合并操作的程序,可以將文本、圖片和視頻進(jìn)行合并,如果感興趣,可以參考一下:文件合并(圖片+視頻),修改md5值,隱藏文件

一個(gè)簡(jiǎn)單的計(jì)算 md5 的程序

這個(gè)程序是Java網(wǎng)絡(luò)編程上面的,這里去掉了線程,簡(jiǎn)化了一下操作,反正只是用于計(jì)算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");
			//第一個(gè)參數(shù)是一個(gè)輸入流
			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;
	}
}

運(yùn)行結(jié)果

在這里插入圖片描述

修改 MD5 值

這里有兩個(gè)圖片,對(duì)它們進(jìn)行合并,注意我這里的合并,不是通常所說(shuō)的文件合并(例如合成九宮格圖片),而是將文件的二進(jìn)制數(shù)據(jù)合并。

在這里插入圖片描述

先計(jì)算文件的 md5 值,注意下面的 Ahusky.jpeg 是上面的 husky.jpeg 的重命名,可以看出來(lái)對(duì)于md5值來(lái)說(shuō)并沒有變化,所以這是同一個(gè)文件。

在這里插入圖片描述

然后將文件合并,這里用到的程序是我上面關(guān)于文件合并里面介紹的。可以進(jìn)入了解詳情,這里不再介紹了。

在這里插入圖片描述

計(jì)算合并后文件的 md5 值

在這里插入圖片描述

到此這篇關(guān)于如何使用Java計(jì)算修改文件的MD5值的文章就介紹到這了,更多相關(guān)Java計(jì)算修改文件的MD5值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring boot配置 swagger的示例代碼

    Spring boot配置 swagger的示例代碼

    Swagger是一組開源項(xiàng)目,Spring 基于swagger規(guī)范,可以將基于SpringMVC和Spring Boot項(xiàng)目的項(xiàng)目代碼,自動(dòng)生成JSON格式的描述文件,接下來(lái)通過(guò)本文給大家介紹Spring boot配置 swagger的示例代碼,一起看看吧
    2021-09-09
  • java 實(shí)現(xiàn)下壓棧的操作(能動(dòng)態(tài)調(diào)整數(shù)組大小)

    java 實(shí)現(xiàn)下壓棧的操作(能動(dòng)態(tài)調(diào)整數(shù)組大小)

    這篇文章主要介紹了java 實(shí)現(xiàn)下壓棧的操作(能動(dòng)態(tài)調(diào)整數(shù)組大小),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java數(shù)組高級(jí)算法與Arrays類常見操作小結(jié)【排序、查找】

    Java數(shù)組高級(jí)算法與Arrays類常見操作小結(jié)【排序、查找】

    這篇文章主要介紹了Java數(shù)組高級(jí)算法與Arrays類常見操作,結(jié)合實(shí)例形式總結(jié)分析了Java數(shù)組常見的排序算法、查找算法相關(guān)原理、實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2019-03-03
  • 詳解如何在SpringBoot項(xiàng)目中使用統(tǒng)一返回結(jié)果

    詳解如何在SpringBoot項(xiàng)目中使用統(tǒng)一返回結(jié)果

    在一個(gè)完整的項(xiàng)目中,如果每一個(gè)控制器的方法都返回不同的結(jié)果,那么對(duì)項(xiàng)目的維護(hù)和擴(kuò)展都會(huì)很麻煩。因此,本文為大家準(zhǔn)備了SpringBoot項(xiàng)目中使用統(tǒng)一返回結(jié)果的方法,需要的可以參考一下
    2022-10-10
  • 淺談Java 類中各成分加載順序和內(nèi)存中的存放位置

    淺談Java 類中各成分加載順序和內(nèi)存中的存放位置

    下面小編就為大家?guī)?lái)一篇淺談Java 類中各成分加載順序和內(nèi)存中的存放位置。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • Java Spring boot 2.0 跨域問(wèn)題的解決

    Java Spring boot 2.0 跨域問(wèn)題的解決

    本篇文章主要介紹了Java Spring boot 2.0 跨域問(wèn)題的解決,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • JAVA調(diào)用JavaScript方法代碼示例

    JAVA調(diào)用JavaScript方法代碼示例

    我們都知道腳本語(yǔ)言非常靈活,在處理某些問(wèn)題的時(shí)候Java實(shí)現(xiàn)用十幾行來(lái)寫,用js可能不到十行就寫完,并且非常簡(jiǎn)潔,這篇文章主要給大家介紹了關(guān)于JAVA調(diào)用JavaScript方法的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • SpringBoot實(shí)現(xiàn)阿里云快遞物流查詢的示例代碼

    SpringBoot實(shí)現(xiàn)阿里云快遞物流查詢的示例代碼

    本文將基于springboot實(shí)現(xiàn)快遞物流查詢,物流信息的獲取通過(guò)阿里云第三方實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-10-10
  • Java虛擬機(jī)內(nèi)存區(qū)域劃分詳解

    Java虛擬機(jī)內(nèi)存區(qū)域劃分詳解

    這篇文章主要介紹了Java虛擬機(jī)內(nèi)存區(qū)域劃分,本文邏輯清晰,可以幫助我們更好的掌握虛擬機(jī),對(duì)我們學(xué)習(xí)java來(lái)說(shuō)是一種幫助,需要的朋友可以參考下
    2021-04-04
  • spring mvc中的@PathVariable獲得請(qǐng)求url中的動(dòng)態(tài)參數(shù)

    spring mvc中的@PathVariable獲得請(qǐng)求url中的動(dòng)態(tài)參數(shù)

    本文主要介紹了spring mvc中的@PathVariable獲得請(qǐng)求url中的動(dòng)態(tài)參數(shù)的代碼。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02

最新評(píng)論