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

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

你可能感兴趣的:(版本管理)