2012-11-14 5 views
3

결과는 동일한 유형의 파일이 동일한 md5 해시 값을 반환한다는 것입니다. 예를 들어 두 개의 다른 jpg가 나에게 동일한 결과를 제공합니다. 그러나 JPG 대 APK는 다른 결과를 제공합니다. 이 고장URL에서 MD5 해시 가져 오기

public static String checkHashURL(String input) { 
    try { 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     InputStream is = new URL(input).openStream(); 

     try { 
      is = new DigestInputStream(is, md); 

      int b; 

      while ((b = is.read()) > 0) { 
       ; 
      } 
     } finally { 
      is.close(); 
     } 
     byte[] digest = md.digest(); 
     StringBuffer sb = new StringBuffer(); 

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

    } catch (Exception ex) { 
     throw new RuntimeException(ex); 
    } 
} 
+1

정말로 404 오류 대 DNS- 찾을 수없는 오류 대신 해시 jpg 파일이 있습니까? –

+1

내 생각 엔 파일 데이터의 헤더 태그 만 읽고 해시하므로 비슷한 유형의 파일이 동일하게 보일 수 있습니다. 읽을 데이터를 디버깅하는 것이 좋습니다. – Vulcan

답변

4

여기

내 코드는

... :

while ((b = is.read()) > 0) 

두 개의 파일이있는 경우 0입니다 스트림의 첫 번째 바이트에서 중지됩니다 귀하의 코드 첫 번째 0 바이트 전에 동일한 값을 입력하면 실패합니다. 당신이 정말read의 한 번에 한 바이트 씩 버전을 호출 할 경우, 당신이 원하는 :

while (is.read() != -1) {} 

parameterless InputStream.read() 방법은 반환 -1 스트림의 끝에 도달 할 때 호출됩니다.

(당신이 그것을 사용하지 않을로 b에 값을 할당 할 필요가 없습니다.)

더 나은 한 번에 버퍼를 읽는 것 :

byte[] ignoredBuffer = new byte[8 * 1024]; // Up to 8K per read 
while (is.read(ignoredBuffer) > 0) {} 

이 시간 조건 InputStream.read(byte[])은 빈 버퍼를 전달한 경우에만 0을 반환하기 때문에 유효합니다. 그 이외의 경우는, 읽힌 데이터의 길이를 돌려주는 적어도 1 바이트를 읽어들이거나, 스트림의 마지막에 이르렀을 경우는 -1을 돌려 주려고합니다.

+0

설명해 주셔서 감사합니다. – k1komans

+1

@ user1288686 : 실제로 문제가 해결 되었습니까? :) –

+0

네, 있습니다. 질문이 하나 더 있습니다 .. 바이트 단위로 파일을 읽는 중이므로 파일을 다운로드하는 것과 같은 양의 대역폭을 사용합니까? 내 안드로이드 응용 프로그램에 다운로드 한 업데이트를 확인하기 위해 이것을 개발하고 있으며 통신 사업자의 대역폭 제한에 의해 제한되기 때문에 궁금합니다. – k1komans