2011-02-28 2 views
2

OSX 및 Windows에서 파일의 md5 합계를 확인해야하는 스크립트를 작성하고 있습니다. 커맨드 라인 md5 공구, 그러나 나는 다른 결과를 얻는다. 코드는 다음과 같습니다.md5가 명령 줄과 다른 파이썬 출력 (이진 모드에서도)

def MD5File(self, f, block_size=2**20): 
    md5 = hashlib.md5() 
    while True: 
    data = f.read(block_size) 
    if not data: 
     break 
    md5.update(data) 
    return md5.hexdigest() 

with open(path, 'rb') as f: 
    print MD5File(path) 

바이너리 모드에서 파일을 여는 것은 명백하지만 다른 결과가 나타납니다. 내가 한 번에 모든 것을 읽는 것만으로도 데이터를 버퍼링하는 다른 방법을 시도했지만, 파이썬 스크립트는 일관되게 동일한 것을 반환하지만, 이는 md5 명령과는 다릅니다.

그래서 내가 뭘 잘못하고 있는지, 아니면 md5 filename이 실제로 기대 한대로 작동하지 않는 경우가 있습니까? 파일의 바이너리를 직접 읽고 있기 때문에 개행 문제가 없어야합니다. cat filename | md5을 실행하면 다른 결과가 다시 나타납니다.

+0

이진 모드에서 파일을 여는 것이 텍스트 파일이 아닌 경우를 제외하고 유닉스와 윈도우가 파일에서 다른 줄 끝을 사용한다는 사실을 변경한다고 생각합니다.이 경우 내 의견은 부적합합니다. 줄 끝을 확인 했니? –

+0

'print MD5File (path)'가 아닌'print MD5File (f)'는 게시에 오타가있는 것뿐입니다. – MattH

+0

가! 내 문제를 발견 : 파일 대신 문자열의 해시를 반환하기 위해 쉘에서'md5' 명령을 재정의 했으므로 실제로 md5 프로그램을 전혀 실행하지 않았습니다. –

답변

0

사용자 오류입니다. 나는 파일 대신 문자열의 해쉬를 반환하기 위해 쉘에서 md5 명령을 오버라이드했다.

4

은 나를 위해 제대로 일을 다음

In [1]: with file("play.py") as f: 
    ...:  data = f.read() 
    ...:  from hashlib import md5 
    ...:  print(md5(data).hexdigest()) 
    ...: 
07030b37de71f3ad9ef2398b4f0c3a3e 

In [2]: 
[email protected] ~ $ md5 play.py 
MD5 (play.py) = 07030b37de71f3ad9ef2398b4f0c3a3e 

내 코드를 시도하고 당신을 위해 작동하는지 확인하십시오. 그렇지 않다면 파이썬 스크립트와 시험용 샘플 파일 gist을 업로드 할 예정입니까?

+0

Benson에게 감사드립니다. 저의 원래 구현이었습니다. –

관련 문제