TL; DR ใช้บัฟเฟอร์เพื่อไม่ใช้หน่วยความจำมากมาย
เราได้รับการปมของปัญหาของคุณผมเชื่อว่าเมื่อเราพิจารณาผลกระทบความทรงจำของการทำงานกับไฟล์ที่มีขนาดใหญ่มาก เราไม่ต้องการให้เด็กเลวคนนี้ปั่น RAM 2 กิ๊กสำหรับไฟล์ขนาด 2 กิกะไบต์ดังที่pasztorpistiชี้ให้เห็นเราต้องจัดการกับไฟล์ที่ใหญ่กว่านั้นเป็นชิ้น ๆ !
import sys
import hashlib
BUF_SIZE = 65536
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()))
สิ่งที่เราทำคือเรากำลังอัปเดตแฮชของเด็กไม่ดีในชิ้น 64kb ของเราที่เราไปพร้อมกับสำรวยประโยชน์ hashlib ของวิธีการอัพเดต วิธีนี้ทำให้เราใช้หน่วยความจำน้อยกว่า 2gb ที่จะแฮชผู้ชายทั้งหมดในคราวเดียว!
คุณสามารถทดสอบได้ด้วย:
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
หวังว่าจะช่วยได้!
นอกจากนี้ทั้งหมดนี้มีรายละเอียดอยู่ในคำถามที่เชื่อมโยงทางด้านขวามือ: รับแฮช MD5 ของไฟล์ขนาดใหญ่ใน Python
ภาคผนวก!
โดยทั่วไปเมื่อเขียนหลามจะช่วยให้ได้รับเป็นนิสัยต่อไปนี้ห้าวหาญ-8 ตัวอย่างเช่นในตัวแปร python มักจะขีดล่างแยกออกจากกันไม่ใช่ camelCased แต่นั่นเป็นเพียงรูปแบบและไม่มีใครสนใจสิ่งเหล่านั้นจริงๆยกเว้นคนที่ต้องอ่านแบบแย่ ๆ ... ซึ่งอาจเป็นเพราะคุณอ่านรหัสนี้หลายปีต่อจากนี้