2011-02-09 3 views
2

hashlib 모듈에서 hashlib.md5() 함수를 사용하여 파일의 md5 해시를 계산하려고합니다.Hashlib 파이썬 모듈의 메서드 업데이트에서 최대 바이트 수 제한

그래서 이런 코드 writed 있음 :

Buffer = 128 
f = open("c:\\file.tct", "rb") 
m = hashlib.md5() 

while True: 
    p = f.read(Buffer) 
    if len(p) != 0: 
     m.update(p) 
    else: 
     break 
print m.hexdigest() 
f.close() 

가 나는 등 64, 128, 256 및 가변 값 버퍼 늘리면 기능 업데이트가 빠르다 밝혔다. 초과 할 수없는 상한선이 있습니까? RAM 메모리 문제 일 수도 있지만 잘 모르겠습니다.

답변

0

버퍼 값은 읽고 메모리에 한 번에 저장되는 바이트 수이므로 사용할 수있는 메모리는 한도뿐입니다.

그러나 큰 값은 자동으로 더 빠르지 않습니다. 어떤 시점에서 버퍼가 너무 크면 메모리 페이징 문제 또는 메모리 할당으로 인한 다른 속도 저하로 빠질 수 있습니다. 속도가 빠른 속도로 돌아올 때까지 크고 큰 값으로 실험해야합니다.

2

임의로 큰 파일을 처리하려면 블록으로 읽어야합니다. 이러한 블록의 크기는 2의 거듭 제곱이어야하며 md5의 경우 512 비트 블록은 알고리즘이 작동하는 단위이므로 최소 가능 블록은 64 바이트 (512 비트)로 구성됩니다. 우리가 넘어 정확한 기준을 설정하려고하면

는하지만, 여부가 2048 바이트 블록 4096 바이트 블록에 비해 더 말 ... 우리는 실패 할 가능성이 있습니다. 이것은 매우 신중하게 테스트되고 측정되어야하며, 거의 항상 가치는 경험을 고려하여 임의로 선택됩니다.

3

큰 (≈ 2**40) 청크 크기는 MemoryError이됩니다. 즉, 사용 가능한 RAM 이외에는 제한이 없습니다. 반면에 bufsize는 내 컴퓨터에서 2**31-1에 의해 제한됩니다

import hashlib 
from functools import partial 

def md5(filename, chunksize=2**15, bufsize=-1): 
    m = hashlib.md5() 
    with open(filename, 'rb', bufsize) as f: 
     for chunk in iter(partial(f.read, chunksize), b''): 
      m.update(chunk) 
    return m 

chunksize는 아주 작은 한만큼 속도가 느려질 수 있습니다. 그것을 측정하십시오.

10 MB 파일의 경우 2**15chunksize이 내가 테스트 한 파일 중에서 가장 빠릅니다.

+0

방금 ​​3.1.3에서 이것을 시도한 결과, 빈 문자열을'iter (partial (f.read, chunksize, b '')'와 비교하여 '' '! = b' ' '. – pix