1. 程式人生 > >java獲取檔案MD5,獲取字串MD5

java獲取檔案MD5,獲取字串MD5

 獲取md5值4個步驟:

1.建立MessageDigest物件md5。

2.使用md的update(byte[] buffer)方法將資料更新到md5物件中。

3.使用md5的digest()方法獲得摘要,該摘要是一個長度為16的陣列。

4.將該摘要陣列轉換為32位的md5值.

注意:如果要獲得16位的md5值就是取32位的md5值的中間16位。可以使用subString(8,24)擷取。

以下是獲得檔案和字串md5的方法,去除main方法即可作為一個工具類。

package com.wenba1314.tools;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Tool {
    private static MessageDigest md;
    static {
        try {
            //初始化摘要物件
            md = MessageDigest.getInstance("md5");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) throws IOException {
        System.out.println(generateMD5ForString("test"));
        System.out.println(generateMD5ForFile(new File("1.jpg")));

    }
    //獲得字串的md5值
    public static String generateMD5ForString(String str){
        //更新摘要資料
        md.update(str.getBytes());
        //生成摘要陣列
        byte[] digest = md.digest();
        //清空摘要資料,以便下次使用
        md.reset();
        return formatByteArrayTOString(digest);
    }
    //獲得檔案的md5值
    public static String generateMD5ForFile(File file) throws IOException {
        //建立檔案輸入流
        FileInputStream fis = new FileInputStream(file);
        //將檔案中的資料寫入md物件
        byte[] buffer = new byte[1024];
        int len=-1;
        while ((len = fis.read(buffer)) != -1) {
            md.update(buffer, 0, len);
        }
        fis.close();
        //生成摘要陣列
        byte[] digest = md.digest();
        //清空摘要資料,以便下次使用
        md.reset();
        return formatByteArrayTOString(digest);
    }
    //將摘要位元組陣列轉換為md5值
    public static String formatByteArrayTOString(byte[] digest) {
        //建立sb用於儲存md5值
        StringBuffer sb = new StringBuffer();
        int temp;
        for (int i=0;i<digest.length;i++) {
            //將資料轉化為0到255之間的資料
            temp=digest[i]&0xff;
            if (temp < 16) {
                sb.append(0);
            }
            //Integer.toHexString(temp)將10進位制數字轉換為16進位制
            sb.append(Integer.toHexString(temp));
        }
        return sb.toString();
    }
}