MD5的相关知识

  MD5算法是一种消息摘要,用于提供消息的完整性保护。

  一  其实就是为了保护文件传输的完整性,比如我们从网上下载的文件,如果其在传输过程中被篡改过的话,则我们所下载下来的文件的md5值和源文件肯定是不一样的。

  二  涉及到我们的android项目里的话,就是app在进行版本升级的时候,我们需要计算我们下载文件的md5值与服务器该文件的md5值进行比较,如果一样则代表文件是完整的且没有被修改过,反之则说明文件不完整,我们就需要重新下载一份。

接下来我们贴出关于文件和字符串MD5值计算的相关代码:

package com.example.asiatravel.md5demo;

import android.util.Log;

import java.io.FileInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;

/**
 * Created by kuangxiaoguo on 16/9/6.
 */
public class MessageDigestUtil {

    private static final String TAG = "TAG";

    /**
     * 计算字符串的MD5值
     *
     * @param data 要计算的字符串对应的字节数组
     * @return 字符串的MD5值
     */
    public static String encryptMD5(byte[] data) {
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            md5.update(data);
            byte[] resultBytes = md5.digest();
            /*
            将字节数组转化为16进制
             */
            return ByteToHexUtil.fromByteToHex(resultBytes);
        } catch (Exception e) {
            Log.d(TAG, "encryptMD5: " + e.getMessage());
        }
        return null;
    }

    /**
     * 计算文件的MD5值
     *
     * @param path 文件路径
     * @return 文件MD5值
     */
    public static String getFileMD5(String path) {
        try {
            FileInputStream fileInputStream = new FileInputStream(path);
            DigestInputStream dis = new DigestInputStream(fileInputStream, MessageDigest.getInstance("MD5"));
            byte[] buffer = new byte[1024];
            int read = dis.read(buffer, 0, 1024);
            while (read != -1) {
                read = dis.read(buffer, 0, 1024);
            }
            dis.close();
            fileInputStream.close();
            MessageDigest md5 = dis.getMessageDigest();
            return ByteToHexUtil.fromByteToHex(md5.digest());
        } catch (Exception e) {
            Log.d(TAG, "getFileMD5: " + e.getMessage());
        }
        return null;
    }
}

然后是把字节数组转化为16进制的工具类:

package com.example.asiatravel.md5demo;

/**
 * Created by kuangxiaoguo on 16/9/6.
 * <p/>
 * 将字节数组转化为16进制的工具类
 */
public class ByteToHexUtil {

    public static String fromByteToHex(byte[] resultBytes) {
        StringBuilder builder = new StringBuilder();
        for (byte resultByte : resultBytes) {
            if (Integer.toHexString(0xFF & resultByte).length() == 1) {
                builder.append(0).append(Integer.toHexString(0xFF & resultByte));
            } else {
                builder.append(Integer.toHexString(0xFF & resultByte));
            }
        }
        return builder.toString();
    }

}

总结:对于MD5值的计算并不难,但是要理解每行代码到底是什么意思,而不是死记代码,这样对于我们才有真正的提高。另外如果大家有那里不明白的地方可以留言或者发

邮件[email protected],这样我们可以共同提高。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章