詳解JAVA中獲取文件MD5值的四種方法
JAVA中獲取文件MD5值的四種方法其實(shí)都很類似,因?yàn)楹诵亩际峭ㄟ^(guò)JAVA自帶的MessageDigest類來(lái)實(shí)現(xiàn)。獲取文件MD5值主要分為三個(gè)步驟,第一步獲取文件的byte信息,第二步通過(guò)MessageDigest類進(jìn)行MD5加密,第三步轉(zhuǎn)換成16進(jìn)制的MD5碼值。幾種方法的不同點(diǎn)主要在第一步和第三步上。具體可以看下面的例子:
方法一、
private final static String[] strHex = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
public static String getMD5One(String path) {
StringBuffer sb = new StringBuffer();
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] b = md.digest(FileUtils.readFileToByteArray(new File(path)));
for (int i = 0; i < b.length; i++) {
int d = b[i];
if (d < 0) {
d += 256;
}
int d1 = d / 16;
int d2 = d % 16;
sb.append(strHex[d1] + strHex[d2]);
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}方法一是比較原始的一種實(shí)現(xiàn)方法,首先將文件一次性讀入內(nèi)存,然后通過(guò)MessageDigest進(jìn)行MD5加密,最后再手動(dòng)將其轉(zhuǎn)換為16進(jìn)制的MD5值。
方法二、
public static String getMD5Two(String path) {
StringBuffer sb = new StringBuffer("");
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(FileUtils.readFileToByteArray(new File(path)));
byte b[] = md.digest();
int d;
for (int i = 0; i < b.length; i++) {
d = b[i];
if (d < 0) {
d = b[i] & 0xff;
// 與上一行效果等同
// i += 256;
}
if (d < 16)
sb.append("0");
sb.append(Integer.toHexString(d));
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}方法二與方法一不同的地方主要是在步驟三,這里借助了Integer類的方法實(shí)現(xiàn)16進(jìn)制的轉(zhuǎn)換,比方法一更簡(jiǎn)潔一些。PS:JAVA中byte是有負(fù)數(shù)的,代碼中&0xff的操作與計(jì)算機(jī)中數(shù)據(jù)存儲(chǔ)的原理有關(guān),即負(fù)數(shù)存儲(chǔ)的是二進(jìn)制的補(bǔ)碼,有興趣的童鞋可以挖一下,這里不展開(kāi)說(shuō)。
方法三、
public static String getMD5Three(String path) {
BigInteger bi = null;
try {
byte[] buffer = new byte[8192];
int len = 0;
MessageDigest md = MessageDigest.getInstance("MD5");
File f = new File(path);
FileInputStream fis = new FileInputStream(f);
while ((len = fis.read(buffer)) != -1) {
md.update(buffer, 0, len);
}
fis.close();
byte[] b = md.digest();
bi = new BigInteger(1, b);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bi.toString(16);
}方法三與前面兩個(gè)方法相比,在讀入文件信息上有點(diǎn)不同。這里是分多次將一個(gè)文件讀入,對(duì)于大型文件而言,比較推薦這種方式,占用內(nèi)存比較少。步驟三則是通過(guò)BigInteger類提供的方法進(jìn)行16進(jìn)制的轉(zhuǎn)換,與方法二類似。
方法四、
DigestUtils.md5Hex(new FileInputStream(path));
方法四應(yīng)該是最便捷的吧,哈哈,好東西要留在最后,如果你只需要使用標(biāo)準(zhǔn)的MD5,其實(shí)一行代碼就夠了,JAVA自帶的commons-codec包就提供了獲取16進(jìn)制MD5值的方法。其底層實(shí)現(xiàn)上,也是分多次將一個(gè)文件讀入,類似方法三。所以性能上也不錯(cuò)。
總結(jié):其實(shí)方法都是類似的,推薦使用方法四,簡(jiǎn)潔且性能不錯(cuò),當(dāng)然,如果要做一些調(diào)整什么的,可以根據(jù)自己的需求進(jìn)行方法的選擇。
PS:其實(shí)還有一個(gè)重點(diǎn),就是如何知道自己生成的MD5值是否正確呢?
方法很多,其實(shí)有一個(gè)挺簡(jiǎn)單的方法,不需要另外安裝什么軟件。使用windows自帶的命令即可:certutil -hashfile [文件路徑] MD5,例子如下:

到此這篇關(guān)于JAVA中獲取文件MD5值的四種方法的文章就介紹到這了,更多相關(guān)java獲取文件MD5值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Jmeter如何獲取jtl文件中所有的請(qǐng)求報(bào)文詳解
JMeter的可以創(chuàng)建一個(gè)包含測(cè)試運(yùn)行結(jié)果的文本文件,這些通常稱為JTL文件,因?yàn)檫@是默認(rèn)擴(kuò)展名,但可以使用任何擴(kuò)展名,這篇文章主要給大家介紹了關(guān)于Jmeter如何獲取jtl文件中所有的請(qǐng)求報(bào)文的相關(guān)資料,需要的朋友可以參考下2021-09-09
Java Web 實(shí)現(xiàn)QQ登錄功能一個(gè)帳號(hào)同一時(shí)間只能一個(gè)人登錄
對(duì)于一個(gè)帳號(hào)在同一時(shí)間只能一個(gè)人登錄,下文給大家介紹的非常詳細(xì),對(duì)java web qq 登錄功能感興趣的朋友一起看看吧2016-11-11
如何基于java向mysql數(shù)據(jù)庫(kù)中存取圖片
這篇文章主要介紹了如何基于java向mysql數(shù)據(jù)庫(kù)中存取圖片,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02

