Java之MD5值校驗
阿新 • • 發佈:2019-02-20
<<首先宣告本文內容有參考網上資源,文章開頭我首先要向他們表示感謝,眾包力量無窮啊>>
之前學過《電腦保安》這門課,瞭解了MD5,不過沒有自己具體實現過,今天講的也只是呼叫java包中已提供的相關功能
MD5這個私有類
因為專案測試的需要,自己添加了個MD5私有類,用來檢測原始檔案內容和上傳後被get下來的檔案內容是否相同。程式碼貼下!
程式碼應該是比較容易看懂的,一個私有成員md5,用於計算MD5值, 以及一個char陣列,用於將得到的MD5值轉換為十六進位制(PS: md5值一般以十六進位制表示,那到底是幾位16進位制呢?請看後面分析)。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); } }
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上發篇部落格,謝謝各位看官支援!可以留言哦~