2015-11-03 2 views
0

Я создаю генератор хеша md5. Сначала я тестировал его с исходным файлом, затем я изменил файл, чтобы узнать, изменены ли хэш-коды md5 или нет. хэш-код не изменился даже после того, как я изменил тот же файл. в чем проблема?MD5 хеш не изменился после того, как файл был изменен

public class MD5CheckSum { 

public byte [] createChecksum (String filename) throws Exception { 
    InputStream fis = new FileInputStream(filename); 

    byte[] buffer = new byte[1024]; 
    MessageDigest complete = MessageDigest.getInstance("MD5"); 
    int numRead; 

    do { 
     numRead = fis.read(buffer); 
     if (numRead > 0){ 
      complete.update(buffer,0,numRead); 
     } 
    }while (numRead !=1); 

    fis.close(); 
    return complete.digest(); 

} 
public String getMD5Checksum(String filename) throws Exception { 
    /*byte[] b = createChecksum(filename); 
    String result = ""; 

    for (int i=0; i < b.length; i++){ 
     result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1); 
    } 
    return result;*/ 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    byte[] messageDigest = md.digest(filename.getBytes()); 
    BigInteger number = new BigInteger(1, messageDigest); 
    String hashtext = number.toString(16); 
    // Now we need to zero pad it if you actually want the full 32 chars. 
    while (hashtext.length() < 32) { 
     hashtext = "0" + hashtext; 
    } 
    return hashtext; 
} 

public MD5CheckSum() throws Exception{ 

    String path = "C:/Users/user/Downloads/Documents/ECOMM SUMMER BLOSSOM.docx"; 

    System.out.println("MD5 Hash Succeed"); 

    System.out.println(getMD5Checksum(path)); 

} 

EDITED: Я изменил код

public static String getMD5Checksum(String filename) throws Exception { 
     byte[] b = createChecksum(filename); 
     String result = ""; 

     for (int i=0; i < b.length; i++) { 
      result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1); 
     } 
     return result; 
    } 

    public static void main(String args[]) { 
     try { 
      System.out.println("Start hashing...."); 
      System.out.println(getMD5Checksum("C:/Users/user/Downloads/Documents/21.pdf")); 
      System.out.println("Done hashing...."); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

Но это занимает слишком много времени, чтобы генерировать хэш и в настоящее время хэш до сих пор не создан до сих пор.

ответ

4

filename.getBytes() получает байты имени файла, а не содержимого файла.

Я мог бы рассказать вам, как загрузить весь файл в массив байтов, но это было бы плохо, потому что оно могло занимать огромные объемы памяти, когда просто не нужно хранить весь файл в памяти, в то время как вычисляется хэш.

Вместо этого вы должны открыть поток и получить хэш этого. См. Этот ответ для этого: https://stackoverflow.com/a/304350/360211

+0

Не могли бы вы взглянуть на мой отредактированный вопрос? – August

1

Вы, кажется, рассчитываете сумму MD5 filename не содержание файла. То, что вы должны были сделать, чтобы избежать этого, - использовать файл с известной суммой MD5 (например, запустите md5sum) и проверьте, дает ли ваш код тот же результат.

Также я не могу не отметить, что ваш createCheckSum кажется лучшим кандидатом на работу, поскольку он, похоже, действительно работает над содержимым файла.

Просто убедитесь, что вы получаете различное значение для разных входных данных, можете показать, что у вас есть кандидат для суммирования проверок, но это плохая проверка, что на самом деле это правильный алгоритм.

+0

Не могли бы вы взглянуть на мой отредактированный вопрос? – August

Смежные вопросы