2012-10-31 108 views

回答

34

轉換文件內容轉換成字符串&使用下面的方法:

public static String getMD5EncryptedString(String encTarget){ 
     MessageDigest mdEnc = null; 
     try { 
      mdEnc = MessageDigest.getInstance("MD5"); 
     } catch (NoSuchAlgorithmException e) { 
      System.out.println("Exception while encrypting to md5"); 
      e.printStackTrace(); 
     } // Encryption algorithm 
     mdEnc.update(encTarget.getBytes(), 0, encTarget.length()); 
     String md5 = new BigInteger(1, mdEnc.digest()).toString(16); 
     while (md5.length() < 32) { 
      md5 = "0"+md5; 
     } 
     return md5; 
    } 

注意,這個簡單的方法是適用於短小的字符串,但不會是有效的對於大文件。對於後者,請參閱dentex's answer

+1

謝謝您的答覆。有效。 –

+0

歡迎....我的榮幸... – hemu

+3

請注意,在Android 4.2.1之前'MessageDigest.getInstance()'不是線程安全的。檢查[錯誤報告](https://code.google.com/p/android/issues/detail?id=37937)和[修復](https://android-review.googlesource.com/#/c/40145 /)。所以如果你使用'HttpResponseCache'你最好檢查一下不同的東西 – mente

2

好友嘗試下面的代碼

MessageDigest md = MessageDigest.getInstance("MD5"); 
InputStream is = new FileInputStream("file.txt"); 
try { 
     is = new DigestInputStream(is, md); 
     // read stream to EOF as normal... 
    } 
finally { 
     is.close(); 
    } 
byte[] digest = md.digest(); 
102

此代碼來自CyanogenMod 10.2 android ROM的CMupdater。 它將下載的ROM測試到更新程序App中。

代碼:https://github.com/CyanogenMod/android_packages_apps_CMUpdater/blob/cm-10.2/src/com/cyanogenmod/updater/utils/MD5.java

它的工作原理就像一個魅力:

/* 
* Copyright (C) 2012 The CyanogenMod Project 
* 
* * Licensed under the GNU GPLv2 license 
* 
* The text of the license can be found in the LICENSE file 
* or at https://www.gnu.org/licenses/gpl-2.0.txt 
*/ 

package com.cyanogenmod.updater.utils; 

import android.text.TextUtils; 
import android.util.Log; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.math.BigInteger; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 

public class MD5 { 
    private static final String TAG = "MD5"; 

    public static boolean checkMD5(String md5, File updateFile) { 
     if (TextUtils.isEmpty(md5) || updateFile == null) { 
      Log.e(TAG, "MD5 string empty or updateFile null"); 
      return false; 
     } 

     String calculatedDigest = calculateMD5(updateFile); 
     if (calculatedDigest == null) { 
      Log.e(TAG, "calculatedDigest null"); 
      return false; 
     } 

     Log.v(TAG, "Calculated digest: " + calculatedDigest); 
     Log.v(TAG, "Provided digest: " + md5); 

     return calculatedDigest.equalsIgnoreCase(md5); 
    } 

    public static String calculateMD5(File updateFile) { 
     MessageDigest digest; 
     try { 
      digest = MessageDigest.getInstance("MD5"); 
     } catch (NoSuchAlgorithmException e) { 
      Log.e(TAG, "Exception while getting digest", e); 
      return null; 
     } 

     InputStream is; 
     try { 
      is = new FileInputStream(updateFile); 
     } catch (FileNotFoundException e) { 
      Log.e(TAG, "Exception while getting FileInputStream", e); 
      return null; 
     } 

     byte[] buffer = new byte[8192]; 
     int read; 
     try { 
      while ((read = is.read(buffer)) > 0) { 
       digest.update(buffer, 0, read); 
      } 
      byte[] md5sum = digest.digest(); 
      BigInteger bigInt = new BigInteger(1, md5sum); 
      String output = bigInt.toString(16); 
      // Fill to 32 chars 
      output = String.format("%32s", output).replace(' ', '0'); 
      return output; 
     } catch (IOException e) { 
      throw new RuntimeException("Unable to process file for MD5", e); 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       Log.e(TAG, "Exception on closing MD5 input stream", e); 
      } 
     } 
    } 
} 
+1

Works很好的方式和GPL調用。謝謝你。 – Michael

+1

不客氣。是的,GPL。它傳播到整個應用程序。 – dentex

+0

感謝它的幫助。 – Hamad

5

我有同樣的任務,該代碼做工精良:

public static String fileToMD5(String filePath) { 
    InputStream inputStream = null; 
    try { 
     inputStream = new FileInputStream(filePath); 
     byte[] buffer = new byte[1024]; 
     MessageDigest digest = MessageDigest.getInstance("MD5"); 
     int numRead = 0; 
     while (numRead != -1) { 
      numRead = inputStream.read(buffer); 
      if (numRead > 0) 
       digest.update(buffer, 0, numRead); 
     } 
     byte [] md5Bytes = digest.digest(); 
     return convertHashToString(md5Bytes); 
    } catch (Exception e) { 
     return null; 
    } finally { 
     if (inputStream != null) { 
      try { 
       inputStream.close(); 
      } catch (Exception e) { } 
     } 
    } 
} 

private static String convertHashToString(byte[] md5Bytes) { 
    String returnVal = ""; 
    for (int i = 0; i < md5Bytes.length; i++) { 
     returnVal += Integer.toString((md5Bytes[i] & 0xff) + 0x100, 16).substring(1); 
    } 
    return returnVal.toUpperCase(); 
} 
3
public static String getMd5OfFile(String filePath) 
{ 
    String returnVal = ""; 
    try 
    { 
     InputStream input = new FileInputStream(filePath); 
     byte[]  buffer = new byte[1024]; 
     MessageDigest md5Hash = MessageDigest.getInstance("MD5"); 
     int   numRead = 0; 
     while (numRead != -1) 
     { 
      numRead = input.read(buffer); 
      if (numRead > 0) 
      { 
       md5Hash.update(buffer, 0, numRead); 
      } 
     } 
     input.close(); 

     byte [] md5Bytes = md5Hash.digest(); 
     for (int i=0; i < md5Bytes.length; i++) 
     { 
      returnVal += Integer.toString((md5Bytes[i] & 0xff) + 0x100, 16).substring(1); 
     } 
    } 
    catch(Throwable t) {t.printStackTrace();} 
    return returnVal.toUpperCase(); 
} 
+0

這個完成了我的工作,謝謝:) – Silas

2

這種方法很適合我,在一個131MB的zip文件。 MD5計算匹配,通過AccuHash(http://www.accuhash.com)計算在同一個文件

public static String calculateMD5(File updateFile) { 
     MessageDigest digest; 
     try { 
      digest = MessageDigest.getInstance("MD5"); 
     } catch (NoSuchAlgorithmException e) { 
      Log.e("calculateMD5", "Exception while getting Digest", e); 
      return null; 
     } 

     InputStream is; 
     try { 
      is = new FileInputStream(updateFile); 
     } catch (FileNotFoundException e) { 
      Log.e("calculateMD5", "Exception while getting FileInputStream", e); 
      return null; 
     } 

     byte[] buffer = new byte[8192]; 
     int read; 
     try { 
      while ((read = is.read(buffer)) > 0) { 
       digest.update(buffer, 0, read); 
      } 
      byte[] md5sum = digest.digest(); 
      BigInteger bigInt = new BigInteger(1, md5sum); 
      String output = bigInt.toString(16); 
      // Fill to 32 chars 
      output = String.format("%32s", output).replace(' ', '0'); 
      return output; 
     } catch (IOException e) { 
      throw new RuntimeException("Unable to process file for MD5", e); 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       Log.e("calculateMD5", "Exception on closing MD5 input stream", e); 
      } 
     } 
    } 
1

我發現下面的工作真的很好:

Process process = Runtime.getRuntime().exec("md5 "+fileLocation); 
BufferedReader inputStream = new BufferedReader(new InputStreamReader(process.getInputStream())); 
String result = inputStream.readLine().split(" ")[0]; 

這就要求內置md5命令。變量fileLocation將被設置爲文件的位置。當然,我建議在這裏建立一些檢查來檢查文件是否存在。

+0

你確定這個二進制文件存在於每一個Android的安裝?在我的設備中,它被稱爲md5sum。 – bk138

+0

@ bk138不再。我認爲在執行任何其他提到的方法之前檢查它是否值得檢查,因爲這個二進制的速度比任何Java實現都要好得多。 –

0

如果需要計算的大文件的MD5,你可能會喜歡用這樣的:

導入:

import java.security.MessageDigest; 

方法:

private byte[] calculateMD5ofFile(String location) throws IOException, NoSuchAlgorithmException { 
     FileInputStream fs= new FileInputStream(location); 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     byte[] buffer=new byte[bufferSize]; 
     int bytes=0; 
     do{ 
      bytes=fs.read(buffer,0,bufferSize); 
      if(bytes>0) 
       md.update(buffer,0,bytes); 

     }while(bytes>0); 
     byte[] Md5Sum = md.digest(); 
     return Md5Sum; 
    } 

Refrence: https://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html


To con將字節數組轉換爲十六進制使用此

public static String ByteArraytoHexString(byte[] bytes) { 
    StringBuilder hexString = new StringBuilder(); 
    for (int i = 0; i < bytes.length; i++) { 
     String hex = Integer.toHexString(bytes[i] & 0xFF); 
     if (hex.length() == 1) { 
      hexString.append('0'); 
     } 
     hexString.append(hex); 
    } 
    return hexString.toString(); 
} 

Refrence In Java, how do I convert a byte array to a string of hex digits while keeping leading zeros?