首頁 > 軟體

詳解JAVA中獲取檔案MD5值的四種方法

2022-08-11 14:00:46

 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!


IT145.com E-mail:sddin#qq.com