Ada cara yang cukup tidak efisien memori .
satu file:
import hashlib
def file_as_bytes(file):
with file:
return file.read()
print hashlib.md5(file_as_bytes(open(full_path, 'rb'))).hexdigest()
daftar file:
[(fname, hashlib.md5(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
Ingat, MD5 diketahui rusak dan tidak boleh digunakan untuk tujuan apa pun karena analisis kerentanan bisa sangat rumit, dan menganalisis kemungkinan penggunaan di masa depan yang mungkin dilakukan oleh kode Anda untuk masalah keamanan tidak mungkin. IMHO, itu harus dihapus dari perpustakaan sehingga semua orang yang menggunakannya terpaksa memperbarui. Jadi, inilah yang harus Anda lakukan sebagai gantinya:
[(fname, hashlib.sha256(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
Jika Anda hanya ingin mencerna 128 bit, Anda bisa melakukannya .digest()[:16]
.
Ini akan memberi Anda daftar tupel, masing-masing tupel berisi nama file dan hash-nya.
Sekali lagi saya sangat mempertanyakan penggunaan MD5 Anda. Anda harus setidaknya menggunakan SHA1, dan diberi kekurangan baru-baru ini ditemukan di SHA1 , bahkan mungkin tidak. Beberapa orang berpikir bahwa selama Anda tidak menggunakan MD5 untuk tujuan 'kriptografi', Anda baik-baik saja. Tetapi hal-hal memiliki kecenderungan untuk menjadi lebih luas dalam ruang lingkup daripada yang Anda harapkan, dan analisis kerentanan kasual Anda mungkin terbukti benar-benar cacat. Yang terbaik adalah membiasakan diri menggunakan algoritma yang tepat di luar gerbang. Itu hanya mengetik banyak huruf yang berbeda. Tidak sesulit itu.
Berikut ini cara yang lebih kompleks, tetapi hemat memori :
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]
Dan, sekali lagi, karena MD5 rusak dan seharusnya tidak pernah benar-benar digunakan lagi:
[(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.sha256()))
for fname in fnamelst]
Sekali lagi, Anda dapat melakukan [:16]
panggilan setelah ke hash_bytestr_iter(...)
jika Anda hanya ingin mencerna 128 bit.
md5sum
?