資源簡介
Java實現(xiàn)MD5大文件校驗碼詳細(xì)解析:
包括具體方法解釋、注釋
通俗易懂、易于理解
代碼片段和文件信息
/**
?*?java實現(xiàn)生成MD5文件校驗碼
?*?2015-11-30
?*/
package?org.jivesoftware.sparkimpl.plugin.fonts;
import?java.io.File;??
import?java.io.FileInputStream;??
import?java.io.IOException;??
import?java.nio.MappedByteBuffer;??
import?java.nio.channels.FileChannel;??
import?java.security.MessageDigest;
import?java.security.NoSuchAlgorithmException;??
/**
?*??MD5計算調(diào)用即可得到MD5的128位整數(shù)
?*??MessageDigest?類是一個引擎類,它是為了提供諸如?SHA1?或?MD5?等密碼上安全的報文摘要功能而設(shè)計的。
?*??密碼上安全的報文摘要可接受任意大小的輸入(一個字節(jié)數(shù)組),并產(chǎn)生固定大小的輸出,該輸出稱為一個摘要或散列。摘要具有以下屬性:
?*??1.無法通過計算找到兩個散列成相同值的報文。
?*??2.摘要不反映任何與輸入有關(guān)的內(nèi)容。
?*??使用報文摘要可以生成數(shù)據(jù)唯一且可靠的標(biāo)識符。有時它們被稱為數(shù)據(jù)的“數(shù)字指紋”。
?*/
public?class?MD5?{??
//首先初始化一個字符數(shù)組,用來存放每個16進(jìn)制字符
????protected?static?char?hexDigits[]?=?{?‘0‘?‘1‘?‘2‘?‘3‘?‘4‘?‘5‘?‘6‘‘7‘?‘8‘?‘9‘?‘a(chǎn)‘?‘b‘?‘c‘?‘d‘?‘e‘?‘f‘?};????
????protected?static?MessageDigest?messageDigest?=?null;??
????static?{??
????????try?{
???????? /**
???????? ?*??創(chuàng)建?MessageDigest?對象
???????? ?*??創(chuàng)建報文摘要實例:
???????? ?*??象所有的引擎類一樣,獲取某類報文摘要算法的?MessageDigest?對象的途徑是
???????? ?*??調(diào)用?MessageDigest?類中的?getInstance?靜態(tài)?factory?方法
???????? ?*/
????????????messageDigest?=?MessageDigest.getInstance(“MD5“);
????????????//拿到一個MD5轉(zhuǎn)換器,返回實現(xiàn)指定摘要算法的?MessageDigest?對象。??
????????}?catch?(NoSuchAlgorithmException?nsaex)?{??
????????????System.err.println(MD5.class.getName()+“初始化失敗,MessageDigest不支持MD5!“);??
????????????nsaex.printStackTrace();??
????????}??
????}??
??
????public?static?void?main(String[]?args)?throws?IOException?{??
????????long?begin?=?System.currentTimeMillis();??
??
????????File?big?=?new?File(“C:\\clk\\eclipse.rar“);//文件絕對路徑??
????????String?md5?=?getFileMD5String(big);??
????????//String?md5?=?getMD5String(“a“);??
????????long?end?=?System.currentTimeMillis();??
????????System.out.println(“md5:“?+?md5?+?“?time:“?+?((end?-?begin)?/?1000)?+?“s“);??
????}??
????/**?
?????*?計算文件的MD5?
?????*?@param?file?文件對象?
?????*?@return?
?????*?@throws?IOException?
?????*/?
????public?static?String?getFileMD5String(File?file)?throws?IOException?{??
????????FileInputStream?in?=?new?FileInputStream(file);??
????????FileChannel?ch?=?in.getChannel();??
??????????
????????//緩沖區(qū)大小(這個可以抽出一個參數(shù))??
????????int?maxSize=?256?*?1024;??
??????????
????????long?startPosition=0L;??
????????long?step=file.length()/maxSize;??
????????/**
?????????*??MappedByteBuffer?將文件直接映射到內(nèi)存(這里的內(nèi)存指的是虛擬內(nèi)存,并不是物理內(nèi)存,后面說證明這一點)。
?????????*??通常,可以映射整個文件,如果文件比較大的話可以分段進(jìn)行映射,只要指定文件的那個部分就可以。
?????????*??而且,與ByteBuffer十分類似,沒有構(gòu)造函數(shù)(你不可new?MappedByteBuffer()來構(gòu)造一個MappedByteBuffer),
?????????*??我們可以通過?java.nio.channels.FileChannel?的?map()?方法來獲取?MappedByteBuffer?。
?????????*??其實說的通俗一點就是Map把文件的內(nèi)容被映像到計算機(jī)虛擬內(nèi)存的一塊區(qū)域,
???????
評論
共有 條評論