MD5是什么?
MD5是message-digest algorithm 5(信息-摘要算法)的縮寫,被廣泛用於加密和解密技術上,它可以說是文件的"數字指紋"。任何一個文件,無論是可執行程序、圖像文件、臨時文件或者其他任何類型的文件,也不管它體積多大,都有且只有一個獨一無二的MD5信息值,並且如果這個文件被修改過,它的MD5值也將隨之改變。因此,我們可以通過對比同一文件的MD5值,來校驗這個文件是否被"篡改"過。 MD5到底有什么用? 當我們下載了文件后,如果想知道下載的這個文件和網站的原始文件是否一模一樣,就可以給自己下載的文件做個MD5校驗。如果得到的MD5值和網站公布的相同,可確認所下載的文件是完整的。如有不同,說明你下載的文件是不完整的:要么就是在網絡下載的過程中出現錯誤,要么就是此文件已被別人修改。為防止他人更改該文件時放入病毒,最好不要使用。一般正規的站點,都會提供文件md5校驗碼,這是為了雙方都方便。
今天上網搜索在Lucene如何避免重復建立索引,看到介紹了一種方法就是用MD5為每個文件賦一個惟一的值,當再次為同一個文件建立索引時,會通過MD5的值識別出相同的文件。於是收藏了MD5在java中使用的代碼:
package com.mr.util;
import java.io.File;
import java.io.FileInputStream;
import java.security.MessageDigest;
/**
* @author CXY
*/
public class SecurityUtil {
/**
* 把字節數組轉成16進位制數
* @param bytes
* @return
*/
public static String bytesToHex(byte[] bytes) {
StringBuffer md5str = new StringBuffer();
//把數組每一字節換成16進制連成md5字符串
int digital;
for (int i = 0; i < bytes.length; i++) {
digital = bytes[i];
if(digital < 0) {
digital += 256;
}
if(digital < 16){
md5str.append("0");
}
md5str.append(Integer.toHexString(digital));
}
return md5str.toString().toUpperCase();
}
/**
* 把字節數組轉換成md5
* @param input
* @return
*/
public static String bytesToMD5(byte[] input) {
String md5str = null;
try {
//創建一個提供信息摘要算法的對象,初始化為md5算法對象
MessageDigest md = MessageDigest.getInstance("MD5");
//計算后獲得字節數組
byte[] buff = md.digest(input);
//把數組每一字節換成16進制連成md5字符串
md5str = bytesToHex(buff);
} catch (Exception e) {
e.printStackTrace();
}
return md5str;
}
/**
* 把字符串轉換成md5
* @param str
* @return
*/
public static String strToMD5(String str) {
byte[] input = str.getBytes();
return bytesToMD5(input);
}
/**
* 把文件轉成md5字符串
* @param file
* @return
*/
public static String fileToMD5(File file) {
if(file == null) {
return null;
}
if(file.exists() == false) {
return null;
}
if(file.isFile() == false) {
return null;
}
FileInputStream fis = null;
try {
//創建一個提供信息摘要算法的對象,初始化為md5算法對象
MessageDigest md = MessageDigest.getInstance("MD5");
fis = new FileInputStream(file);
byte[] buff = new byte[1024];
int len = 0;
while(true) {
len = fis.read(buff, 0, buff.length);
if(len == -1){
break;
}
//每次循環讀取一定的字節都更新
md.update(buff,0,len);
}
//關閉流
fis.close();
//返回md5字符串
return bytesToHex(md.digest());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
