版本差异对比(二) -- 文件的MD5算法

来源:互联网 发布:ssh连接阿里云服务器 编辑:程序博客网 时间:2024/05/29 07:56

java中为比较文件差异,提供了 MessageDigest 类,通过计算出文件的 MD5 值检测文件是否被修改。
java.security.MessageDigest类用于为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。简单点说就是用于生成散列码。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。关于信息摘要和散列码请参照《数字证书简介》

MessageDigest通过其getInstance系列静态函数来进行实例化和初始化。MessageDigest 对象通过使用 update 方法处理数据。任何时候都可以调用 reset 方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest 方法之一完成哈希计算并返回结果。

对于给定数量的更新数据,digest方法只能被调用一次。digest 方法被调用后,MessageDigest 对象被重新设置成其初始状态。

MessageDigest 类计算文件 MD5 有以下特性:
1.只能检测具体文件或压缩包,不能直接检测文件夹。
2.如果压缩包最外层包名被修改或要被检测的文件文件名被修改,但文件并无改动,那么他们生成的 MD5 值相同。
3.压缩包内的文件名被修改,文件无改动,最外层压缩包生成的 MD5 值依旧会改变。
4.文件的 MD5 与其原始解压或压缩路径有关。如果两份相同的文件分别存在于 test1、test2 文件夹,分别将他们压缩,得到的MD5值不一样。
实例:

    /**     * 获取单个文件的MD5值!     *      * @param file     * @return     */    public static String getFileMD5(File file) {        if (!file.isFile()) {            return null;        }        MessageDigest digest = null;        FileInputStream in = null;        byte buffer[] = new byte[1024];        int len;        try {            digest = MessageDigest.getInstance("MD5");            in = new FileInputStream(file);            while ((len = in.read(buffer, 0, 1024)) != -1) {                digest.update(buffer, 0, len);            }            in.close();        } catch (Exception e) {            e.printStackTrace();            return null;        }        BigInteger bigInt = new BigInteger(1, digest.digest());        return bigInt.toString(16);    } /**     * 获取文本的MD5值!     *      * @param file     * @return     */    public static String getStringMD5(String content) {        MessageDigest digest = null;        try {            digest = MessageDigest.getInstance("MD5");        } catch (NoSuchAlgorithmException e) {            throw new RuntimeException("Can not create md5 digest object.", e);        }        digest.update(content.getBytes());        BigInteger bigInt = new BigInteger(1, digest.digest());        return bigInt.toString(16);    }
原创粉丝点击