2012-10-31 10 views

Antwort

34

Konvertieren der Dateiinhalt in Zeichenfolge & die unten Methode verwenden:

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

Beachten Sie, dass dieser einfache Ansatz für kleinere Strings geeignet ist, aber nicht effizient sein für große Dateien. Zu Letzterem siehe dentex's answer.

+1

Vielen Dank für Ihre Antwort. Es funktionierte. –

+0

Willkommen .... mein Vergnügen ... – hemu

+3

Vorsicht vor Android 4.2.1 'MessageDigest.getInstance()' war nicht Thread sicher. Überprüfen Sie [Fehlerbericht] (https://code.google.com/p/android/issues/detail?id=37937) und [fix] (https://android-review.googlesource.com/#/c/40145 /).Also, wenn Sie "HttpResponseCache" verwenden, überprüfen Sie besser für etwas anderes – mente

2

Kumpel versuchen Code folgende

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

Dieser Code stammt vom CMupdater, vom CyanogenMod 10.2 android ROM. Es testet die heruntergeladenen ROMs in die Updater App.

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

Es funktioniert wie ein Charme:

/* 
* 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

Funktioniert gut, und GPL. Danke dafür. – Michael

+1

Gern geschehen. Und ja, GPL. Es verbreitet sich auf die gesamte App. – dentex

+0

danke es hat geholfen. – Hamad

5

ich die gleiche Aufgabe hatte und dieser Code funktioniert hervorragend:

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

Dieser macht den Job perfekt für mich, danke :) – Silas

2

Diese Methode ist für mich gearbeitet , auf einer 131MB Zip-Datei. MD5 berechnet einstimmt durch AccuHash auf derselben Datei berechnet (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

Ich habe folgendes zu arbeiten wirklich gut gefunden:

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

Dies ruft die eingebaute in md5 Befehl. Die Variable fileLocation soll auf den Speicherort der Datei gesetzt werden. Natürlich empfehle ich, hier einige Checks zu erstellen, um zu überprüfen, ob die Datei existiert.

+0

Sind Sie sicher, dass diese Binärdatei auf jeder Android-Installation existiert? Hier bei meinem Gerät heißt es md5sum. – bk138

+0

@ bk138 nicht mehr. Ich denke, es lohnt sich zu überprüfen, ob dies der Fall ist, bevor eine der anderen erwähnten Methoden ausgeführt wird, da die Geschwindigkeit dieser Binärdatei viel besser ist als bei jeder Java-Implementierung. –

0

Wenn Sie berechnen MD5 der großen Datei benötigen, können Sie diese verwenden:

Import:

import java.security.MessageDigest; 

Methode:

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


zu con Vert Byte Array zu Hex. verwenden diese

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?

Verwandte Themen