2012-10-31 13 views
50

मेरे ऐप में मुझे फ़ाइल के लिए एमडी 5 चेकसम उत्पन्न करने की आवश्यकता है। क्या आप कृपया मुझे बता सकते हैं कि क्या कोई तरीका है जिसमें इसे हासिल किया जा सकता है?Android में फ़ाइल के लिए MD5 चेकसम कैसे उत्पन्न करें?

धन्यवाद।

उत्तर

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

एंड्रॉइड 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

यह कोड साइनोजनमोड 10.2 एंड्रॉइड रोम से सीएमपॉडटर से है। यह डाउनलोडर ऐप में डाउनलोड किए गए रोम का परीक्षण करता है।

कोड: 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

की लाइनों के साथ कुछ कहा जाना चाहिए, और जीपीएल काम करता है। इसके लिए धन्यवाद। – Michael

+1

आपका स्वागत है। और हाँ, जीपीएल। यह पूरे ऐप के लिए प्रचारित करता है। – 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

इस विधि मेरे लिए काम किया , एक 131 एमबी ज़िप फ़ाइल पर। 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

क्या आप सुनिश्चित हैं कि यह एंड्रॉइड इंस्टॉल पर यह बाइनरी मौजूद है? यहां मेरे डिवाइस पर, इसे md5sum कहा जाता है। – bk138

+0

@ बीके 138 अब और नहीं। मुझे लगता है कि यह किसी अन्य उल्लिखित तरीकों को करने से पहले करता है, यह जांचने लायक है, क्योंकि इस बाइनरी की गति किसी जावा-कार्यान्वयन की तुलना में बेहतर है। –

0

आप बड़ी फ़ाइल की calculate 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


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?

संबंधित मुद्दे