1. 程式人生 > >Java之MD5值校驗

Java之MD5值校驗

<<首先宣告本文內容有參考網上資源,文章開頭我首先要向他們表示感謝,眾包力量無窮啊>>

      之前學過《電腦保安》這門課,瞭解了MD5,不過沒有自己具體實現過,今天講的也只是呼叫java包中已提供的相關功能

              MD5這個私有類

因為專案測試的需要,自己添加了個MD5私有類,用來檢測原始檔案內容和上傳後被get下來的檔案內容是否相同。程式碼貼下!

private class MD5 {  
	    private MessageDigest md5;  
	    private char hexDigits[] = {
	            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',  'e', 'f'};  
	    
	    public MD5() {  
	        try {  
	            md5 = MessageDigest.getInstance("MD5");  
	        } catch (NoSuchAlgorithmException e) {  
	            throw new RuntimeException("no such md5 algorithm!", e);  
	        }  
	    }  
	    
	    public String getFileMD5(File file) {
	    	FileInputStream fis = null;
	    	try {
	    		fis = new FileInputStream(file);
	    		byte[] buffer = new byte[8192];
	    		int length;
	    		while( (length = fis.read(buffer)) != -1) {
	    			md5.update(buffer, 0, length);
	    		}
	    		return hexString(md5.digest());
	    	} catch (FileNotFoundException e) {
	            logger.error("File<"+ file.getAbsolutePath() + "> not found");
	            return null;
	        } catch (IOException e) {
	            logger.error("MD5 file " + file.getAbsolutePath() + " failed:" + e.getMessage());
	            return null;
	        } finally {
	            try {
	                if (fis != null) 
	                	fis.close();
	            } catch (IOException e) {
	                e.printStackTrace();
	            }
	        }
	    }
	    
	    public String hexString(byte[] source) { 
	        char str[] = new char[16 * 2];
	        int k = 0;
	        for (int i = 0; i < 16; i++) {
	            byte byte0 = source[i];
	            str[k++] = hexDigits[byte0 >>> 4 & 0xf]; 
	            str[k++] = hexDigits[byte0 & 0xf];
	        }  
	        return new String(str);  
	    }  
	    
	}  
        程式碼應該是比較容易看懂的,一個私有成員md5,用於計算MD5值, 以及一個char陣列,用於將得到的MD5值轉換為十六進位制(PS: md5值一般以十六進位制表示,那到底是幾位16進位制呢?請看後面分析)。

        1、建構函式就是根據提供的引數MD5對私有成員md5進行初始化

        2、主要的方法就是根據傳入的檔名file得到檔案內容的MD5值(說過了,以16進製表示,String型別返回),當然,如果你要計算一段字串的MD5,相應做修改即可,傳參改為string, file那部分刪掉之類的,比較簡單啦

        3、我們看到中間是呼叫md5.update操作,將檔案內容以byte形式傳入,最後通過md5.digest計算出MD5的byte陣列,我們另外新增的輔助方法hexString就是用來將byte陣列轉換成字串的,看到了嗎,MD5是32位16進位制數哦

提供了這個私有類作為工具,那麼自己就可以利用到專案當中檢測兩個檔案的MD5值是否相同了,這個不用說了吧,很easy不是?

第一次在CSDN上發篇部落格,謝謝各位看官支援!可以留言哦~微笑