มีวิธีที่ไม่มีประสิทธิภาพของหน่วยความจำสวยที่ไม่มีประสิทธิภาพ
ไฟล์เดียว:
import hashlib
def file_as_bytes(file):
with file:
return file.read()
print hashlib.md5(file_as_bytes(open(full_path, 'rb'))).hexdigest()
รายการไฟล์:
[(fname, hashlib.md5(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
จำไว้ว่าMD5 นั้นใช้งานไม่ได้และไม่ควรใช้เพื่อวัตถุประสงค์ใด ๆ เนื่องจากการวิเคราะห์ช่องโหว่อาจยุ่งยากมากและการวิเคราะห์การใช้งานในอนาคตที่เป็นไปได้รหัสของคุณอาจถูกนำไปใช้เพื่อความปลอดภัย IMHO ควรลบออกจากไลบรารีดังนั้นทุกคนที่ใช้จะถูกบังคับให้อัปเดต ดังนั้นนี่คือสิ่งที่คุณควรทำแทน:
[(fname, hashlib.sha256(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
หากคุณต้องการเพียง 128 .digest()[:16]
บิตมูลค่าย่อยที่คุณสามารถทำได้
สิ่งนี้จะให้รายการของ tuples แต่ละ tuple มีชื่อไฟล์และ hash ของมัน
ฉันขอให้คุณใช้ MD5 อีกครั้ง อย่างน้อยคุณควรใช้ SHA1 และพบข้อบกพร่องล่าสุดใน SHA1ซึ่งอาจไม่ใช่สิ่งนั้น บางคนคิดว่าตราบใดที่คุณไม่ได้ใช้ MD5 เพื่อจุดประสงค์ 'เข้ารหัส' คุณก็ไม่เป็นไร แต่สิ่งต่าง ๆ มีแนวโน้มที่จะจบลงด้วยขอบเขตที่กว้างกว่าที่คุณคาดไว้ในตอนแรกและการวิเคราะห์ช่องโหว่ชั่วคราวของคุณอาจพิสูจน์ว่ามีข้อบกพร่องอย่างสมบูรณ์ เป็นการดีที่สุดที่คุณจะต้องติดนิสัยการใช้อัลกอริทึมที่ถูกต้องจากประตู มันเป็นเพียงการพิมพ์พวงของตัวอักษรที่แตกต่างกันทั้งหมด มันไม่ยากเลย
นี่เป็นวิธีที่ซับซ้อนกว่า แต่มีประสิทธิภาพของหน่วยความจำ :
import hashlib
def hash_bytestr_iter(bytesiter, hasher, ashexstr=False):
for block in bytesiter:
hasher.update(block)
return hasher.hexdigest() if ashexstr else hasher.digest()
def file_as_blockiter(afile, blocksize=65536):
with afile:
block = afile.read(blocksize)
while len(block) > 0:
yield block
block = afile.read(blocksize)
[(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.md5()))
for fname in fnamelst]
และอีกครั้งเนื่องจาก MD5 เสียและไม่ควรใช้อีกต่อไปจริงๆ:
[(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.sha256()))
for fname in fnamelst]
อีกครั้งคุณสามารถวาง[:16]
สายหลังจากนั้นhash_bytestr_iter(...)
ถ้าคุณต้องการย่อย 128 บิตที่คุ้มค่า
md5sum
?