2009-02-11 24 views

Trả lời

7

Đây là một sửa đổi @ʞɔıu's answer sử dụng @Jason S' suggestion.

from __future__ import with_statement 
from hashlib import md5, sha1 

filename = 'hash_one-pass.py' 

hashes = md5(), sha1() 
chunksize = max(4096, max(h.block_size for h in hashes)) 
with open(filename, 'rb') as f: 
    while True: 
     chunk = f.read(chunksize) 
     if not chunk: 
      break 
     for h in hashes: 
      h.update(chunk) 

for h in hashes: 
    print h.name, h.hexdigest() 
15

Điều gì đó giống như vậy?

>>> import hashlib 
>>> hashes = (hashlib.md5(), hashlib.sha1()) 
>>> f = open('some_file', 'r') 
>>> for line in f: 
...  for hash in hashes: 
...   hash.update(line) 
... 
>>> for hash in hashes: 
...  print hash.name, hash.hexdigest() 

hoặc lặp trên f.read (1024) hoặc một cái gì đó như thế để có được khối cố định chiều dài

+0

Đó có vẻ như nó sẽ làm việc nhưng tôi sẽ đọc byte sử dụng một kích thước khối cố định chứ không phải là một cơ sở cho mỗi dòng (một số tập tin nhị phân có thể không chứa ngắt dòng) –

+0

f.readlines() yêu cầu ~ 100MB, nhưng một tác phẩm 'f' đơn thuần (đối tượng tệp là một trình lặp trên các dòng trong Python) – jfs

+0

' cho dòng trong f' lặp lại trên * dòng * trong tệp. nếu kích thước đường là 1MB thì không quan trọng bạn sử dụng kích thước bộ đệm nào; len (dòng) sẽ là 2 ** 20. Do đó tham số thứ 3 cho 'mở()' không hữu ích trong trường hợp này. – jfs

3

Tôi không biết Python nhưng tôi quen thuộc w/tính toán băm.

Nếu bạn xử lý việc đọc tệp theo cách thủ công, chỉ cần đọc trong một khối (256 byte hoặc 4096 byte hoặc bất kỳ thứ gì) tại một thời điểm và chuyển từng khối dữ liệu để cập nhật băm của mỗi thuật toán. (bạn sẽ phải khởi tạo trạng thái lúc bắt đầu và hoàn tất trạng thái ở cuối.)

Các vấn đề liên quan