TL; DR sử dụng bộ đệm để không sử dụng hàng tấn bộ nhớ.
Tôi tin rằng chúng tôi đi đến điểm mấu chốt của vấn đề của bạn khi chúng tôi xem xét tác động của bộ nhớ khi làm việc với các tệp rất lớn . Chúng tôi không muốn cậu bé xấu này sử dụng 2 GB ram cho một tệp 2 gigabyte, vì vậy, như pasztorpisti đã chỉ ra, chúng tôi phải xử lý những tệp lớn hơn đó theo từng phần!
import sys
import hashlib
# BUF_SIZE is totally arbitrary, change for your app!
BUF_SIZE = 65536 # lets read stuff in 64kb chunks!
md5 = hashlib.md5()
sha1 = hashlib.sha1()
with open(sys.argv[1], 'rb') as f:
while True:
data = f.read(BUF_SIZE)
if not data:
break
md5.update(data)
sha1.update(data)
print("MD5: {0}".format(md5.hexdigest()))
print("SHA1: {0}".format(sha1.hexdigest()))
Những gì chúng tôi đã làm là chúng tôi đang cập nhật các mã băm của cậu bé xấu số này ở dạng khối 64kb khi chúng tôi thực hiện cùng với phương pháp cập nhật tiện dụng của hashlib . Bằng cách này, chúng tôi sử dụng ít bộ nhớ hơn rất nhiều so với 2gb mà nó sẽ mất để băm anh chàng cùng một lúc!
Bạn có thể kiểm tra điều này bằng:
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
Hy vọng rằng sẽ giúp!
Ngoài ra, tất cả những điều này được nêu trong câu hỏi được liên kết ở phía bên tay phải: Nhận băm MD5 của các tệp lớn bằng Python
Phụ lục!
Nói chung khi viết python, nó giúp bạn có thói quen làm theo pep-8 . Ví dụ: trong các biến python thường được phân tách bằng dấu gạch dưới chứ không phải là camelCased. Nhưng đó chỉ là phong cách và không ai thực sự quan tâm đến những điều đó ngoại trừ những người phải đọc văn phong tồi tệ ... đó có thể là bạn đọc mã này nhiều năm nữa.