<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
JAVA中獲取檔案MD5值的四種方法其實都很類似,因為核心都是通過JAVA自帶的MessageDigest類來實現。獲取檔案MD5值主要分為三個步驟,第一步獲取檔案的byte資訊,第二步通過MessageDigest類進行MD5加密,第三步轉換成16進位制的MD5碼值。幾種方法的不同點主要在第一步和第三步上。具體可以看下面的例子:
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(); }
方法一是比較原始的一種實現方法,首先將檔案一次性讀入記憶體,然後通過MessageDigest進行MD5加密,最後再手動將其轉換為16進位制的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類的方法實現16進位制的轉換,比方法一更簡潔一些。PS:JAVA中byte是有負數的,程式碼中&0xff的操作與計算機中資料儲存的原理有關,即負數儲存的是二進位制的二補數,有興趣的童鞋可以挖一下,這裡不展開說。
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); }
方法三與前面兩個方法相比,在讀入檔案資訊上有點不同。這裡是分多次將一個檔案讀入,對於大型檔案而言,比較推薦這種方式,佔用記憶體比較少。步驟三則是通過BigInteger類提供的方法進行16進位制的轉換,與方法二類似。
DigestUtils.md5Hex(new FileInputStream(path));
方法四應該是最便捷的吧,哈哈,好東西要留在最後,如果你只需要使用標準的MD5,其實一行程式碼就夠了,JAVA自帶的commons-codec包就提供了獲取16進位制MD5值的方法。其底層實現上,也是分多次將一個檔案讀入,類似方法三。所以效能上也不錯。
總結:其實方法都是類似的,推薦使用方法四,簡潔且效能不錯,當然,如果要做一些調整什麼的,可以根據自己的需求進行方法的選擇。
PS:其實還有一個重點,就是如何知道自己生成的MD5值是否正確呢?
方法很多,其實有一個挺簡單的方法,不需要另外安裝什麼軟體。使用windows自帶的命令即可:certutil -hashfile [檔案路徑] MD5,例子如下:
到此這篇關於JAVA中獲取檔案MD5值的四種方法的文章就介紹到這了,更多相關java獲取檔案MD5值內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45