最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解JAVA中獲取文件MD5值的四種方法

 更新時(shí)間:2022年08月11日 10:51:57   作者:知為誰開  
這篇文章主要介紹了JAVA中獲取文件MD5值的四種方法,獲取文件MD5值主要分為三個(gè)步驟,第一步獲取文件的byte信息,第二步通過MessageDigest類進(jìn)行MD5加密,第三步轉(zhuǎn)換成16進(jìn)制的MD5碼值,需要的朋友可以參考下

 JAVA中獲取文件MD5值的四種方法其實(shí)都很類似,因?yàn)楹诵亩际峭ㄟ^JAVA自帶的MessageDigest類來實(shí)現(xiàn)。獲取文件MD5值主要分為三個(gè)步驟,第一步獲取文件的byte信息,第二步通過MessageDigest類進(jìn)行MD5加密,第三步轉(zhuǎn)換成16進(jìn)制的MD5碼值。幾種方法的不同點(diǎn)主要在第一步和第三步上。具體可以看下面的例子:

方法一、

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();
    }

  方法一是比較原始的一種實(shí)現(xiàn)方法,首先將文件一次性讀入內(nèi)存,然后通過MessageDigest進(jìn)行MD5加密,最后再手動將其轉(zhuǎn)換為16進(jìn)制的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類的方法實(shí)現(xiàn)16進(jìn)制的轉(zhuǎn)換,比方法一更簡潔一些。PS:JAVA中byte是有負(fù)數(shù)的,代碼中&0xff的操作與計(jì)算機(jī)中數(shù)據(jù)存儲的原理有關(guān),即負(fù)數(shù)存儲的是二進(jìn)制的補(bǔ)碼,有興趣的童鞋可以挖一下,這里不展開說。

方法三、

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);
    }

  方法三與前面兩個(gè)方法相比,在讀入文件信息上有點(diǎn)不同。這里是分多次將一個(gè)文件讀入,對于大型文件而言,比較推薦這種方式,占用內(nèi)存比較少。步驟三則是通過BigInteger類提供的方法進(jìn)行16進(jìn)制的轉(zhuǎn)換,與方法二類似。

方法四、

DigestUtils.md5Hex(new FileInputStream(path));

  方法四應(yīng)該是最便捷的吧,哈哈,好東西要留在最后,如果你只需要使用標(biāo)準(zhǔn)的MD5,其實(shí)一行代碼就夠了,JAVA自帶的commons-codec包就提供了獲取16進(jìn)制MD5值的方法。其底層實(shí)現(xiàn)上,也是分多次將一個(gè)文件讀入,類似方法三。所以性能上也不錯。

  總結(jié):其實(shí)方法都是類似的,推薦使用方法四,簡潔且性能不錯,當(dāng)然,如果要做一些調(diào)整什么的,可以根據(jù)自己的需求進(jìn)行方法的選擇。

PS:其實(shí)還有一個(gè)重點(diǎn),就是如何知道自己生成的MD5值是否正確呢?

  方法很多,其實(shí)有一個(gè)挺簡單的方法,不需要另外安裝什么軟件。使用windows自帶的命令即可:certutil -hashfile [文件路徑] MD5,例子如下:

到此這篇關(guān)于JAVA中獲取文件MD5值的四種方法的文章就介紹到這了,更多相關(guān)java獲取文件MD5值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 簡單聊聊Java中驗(yàn)證碼功能的實(shí)現(xiàn)

    簡單聊聊Java中驗(yàn)證碼功能的實(shí)現(xiàn)

    相信大家都經(jīng)常接觸到驗(yàn)證碼的,畢竟平時(shí)上網(wǎng)也能遇到各種驗(yàn)證碼,需要我們輸入驗(yàn)證碼進(jìn)行驗(yàn)證我們是人類,本篇文章就從這幾個(gè)方面出發(fā)說說驗(yàn)證碼,廢話不多說,下面開始正文
    2023-06-06
  • SpringBoot+Mybatis使用Enum枚舉類型總是報(bào)錯No enum constant XX問題

    SpringBoot+Mybatis使用Enum枚舉類型總是報(bào)錯No enum constant&n

    這篇文章主要介紹了SpringBoot+Mybatis使用Enum枚舉類型總是報(bào)錯No enum constant XX問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java優(yōu)化for循環(huán)嵌套的高效率方法

    Java優(yōu)化for循環(huán)嵌套的高效率方法

    這篇文章主要介紹了Java優(yōu)化for循環(huán)嵌套的高效率方法,幫助大家更好的提升java程序性能,感興趣的朋友可以了解下
    2020-09-09
  • SpringBoot內(nèi)置tomcat啟動原理詳解

    SpringBoot內(nèi)置tomcat啟動原理詳解

    這篇文章主要介紹了SpringBoot內(nèi)置tomcat啟動原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • ThreadPoolExecutor中的submit()方法詳細(xì)講解

    ThreadPoolExecutor中的submit()方法詳細(xì)講解

    在使用線程池的時(shí)候,發(fā)現(xiàn)除了execute()方法可以執(zhí)行任務(wù)外,還發(fā)現(xiàn)有一個(gè)方法submit()可以執(zhí)行任務(wù),本文就詳細(xì)的介紹一下ThreadPoolExecutor中的submit()方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-04-04
  • Java游戲服務(wù)器之?dāng)?shù)據(jù)庫表存取封裝

    Java游戲服務(wù)器之?dāng)?shù)據(jù)庫表存取封裝

    這篇文章主要介紹了Java游戲服務(wù)器之?dāng)?shù)據(jù)庫表存取封裝的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • Java toString方法重寫工具之ToStringBuilder案例詳解

    Java toString方法重寫工具之ToStringBuilder案例詳解

    這篇文章主要介紹了Java toString方法重寫工具之ToStringBuilder案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • SpringBoot項(xiàng)目jar發(fā)布后如何獲取jar包所在目錄路徑

    SpringBoot項(xiàng)目jar發(fā)布后如何獲取jar包所在目錄路徑

    這篇文章主要介紹了SpringBoot項(xiàng)目jar發(fā)布后如何獲取jar包所在目錄路徑,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • JAVA hashCode使用方法詳解

    JAVA hashCode使用方法詳解

    本文詳細(xì)解釋了JAVA hashCode的使用方法,提供了測試hashCode和equals方法的使用實(shí)例
    2013-11-11
  • Spring?Boot整合持久層之JdbcTemplate多數(shù)據(jù)源

    Spring?Boot整合持久層之JdbcTemplate多數(shù)據(jù)源

    持久層是JavaEE中訪問數(shù)據(jù)庫的核心操作,SpringBoot中對常見的持久層框架都提供了自動化配置,例如JdbcTemplate、JPA 等,MyBatis 的自動化配置則是MyBatis官方提供的。接下來分別向讀者介紹Spring Boot整合這持久層技術(shù)中的整合JdbcTemplate
    2022-08-08

最新評論

合山市| 龙游县| 砚山县| 金沙县| 嘉定区| 太白县| 久治县| 喀喇沁旗| 古丈县| 华池县| 淳化县| 舟曲县| 江津市| 江山市| 德格县| 无为县| 方城县| 绥宁县| 武陟县| 邵东县| 西乌| 西吉县| 义乌市| 南川市| 宜都市| 青州市| 化德县| 东至县| 余姚市| 厦门市| 繁峙县| 阜宁县| 锡林浩特市| 镇远县| 方山县| 霍山县| 田东县| 汾阳市| 峡江县| 社会| 卓尼县|