详解JAVA中获取文件MD5值的四种方法

知为谁开 2024-03-28 11:23:13编程技术
167

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,例子如下:

md5.png

到此这篇关于JAVA中获取文件MD5值的四种方法的文章就介绍到这了,更多相关java获取文件MD5值内容请搜索站长工具网以前的文章或继续浏览下面的相关文章希望大家以后多多支持站长工具网!

java md5值
THE END
ZhanShen
把烦恼扔进夕阳里,和星星一起沉沦。

相关推荐

Java开发中防范SQL注入的四种方法总结
SQL注入是一种常见的网络安全威胁,可能导致数据泄露、数据篡改甚至系统崩溃。在Java项目中,防范SQL注入是确保应用安全的关键步骤。本文将总结四种有效的防范SQL注入的方法,...
2025-03-06 编程技术
214

使用Java构建高效的Web服务架构
Java作为一种成熟、稳定且功能强大的编程语言,凭借其丰富的生态系统和高性能的特性,成为构建高效Web服务架构的理想选择。本文将详细探讨如何使用Java构建一个高效的Web服务...
2025-03-03 编程技术
214

JavaScript基础教程:变量、数据类型与运算符全解析
JavaScript,作为一种广泛应用于Web开发的脚本语言,其强大的功能和灵活性使其成为前端开发者的必备技能。掌握JavaScript的基础概念是学习高级特性和构建复杂应用的前提。本文...
2025-02-28 编程技术
241

JavaScript新手入门:从零基础到编写第一个脚本
JavaScript不仅能够让网页变得动态、交互性强,还能够实现各种复杂的功能。对于初学者来说,JavaScript可能看起来有些神秘和复杂,但只要你愿意投入时间和精力,它就会变得非...
2025-02-28 编程技术
244

Java中的排序机制:Comparable与Comparator接口区别解析
Java语言提供了两种主要的排序机制:Comparable接口和Comparator接口。这两种机制虽然都能实现排序功能,但它们在实现方式、应用场景和灵活性上存在显著差异。本文将深入解析...
2025-02-13 编程技术
221

DeepSeek集成IntelliJ IDEA:提升Java编程效率
DeepSeek,作为一款专为开发者设计的高性能、智能化人工智能工具,其与IntelliJ IDEA(IDEA)的集成无疑为Java开发者带来了前所未有的编程体验。本文将详细介绍如何将DeepSeek集...
2025-02-10 编程技术
267