Oldukça bellek verimsiz bir yol var .
tek dosya:
import hashlib
def file_as_bytes(file):
with file:
return file.read()
print hashlib.md5(file_as_bytes(open(full_path, 'rb'))).hexdigest()
dosya listesi:
[(fname, hashlib.md5(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
Bununla birlikte, MD5'in bozuk olduğu ve herhangi bir amaç için kullanılmaması gerektiğini unutmayın, çünkü güvenlik açığı analizi gerçekten zor olabilir ve güvenlik sorunları için kodunuzun gelecekte olabilecek olası kullanımlarını analiz etmek imkansızdır. IMHO, kütüphaneden kaldırılmalıdır, böylece onu kullanan herkes güncellemek zorunda kalır. İşte bunun yerine yapmanız gerekenler:
[(fname, hashlib.sha256(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
Sadece 128 bit değerinde sindirim istiyorsanız yapabilirsiniz .digest()[:16]
.
Bu, her bir dosyanın kendi adını ve karmasını içeren bir grup listesi verecektir.
Yine MD5 kullanımınızı şiddetle sorgularım. En azından SHA1'i kullanmalısınız ve SHA1'de keşfedilen son kusurları vermelisiniz , muhtemelen bu bile değil. Bazı insanlar MD5'i 'kriptografik' amaçlar için kullanmadığınız sürece iyi olduğunuzu düşünüyorlar. Ancak, işlerin kapsamda başlangıçta beklediğinizden daha geniş olma eğilimi vardır ve geçici güvenlik açığı analiziniz tamamen kusurlu olabilir. Kapıdan doğru algoritmayı kullanma alışkanlığına sahip olmak en iyisidir. Sadece farklı bir grup harf yazmak yeterlidir. O kadar zor değil.
İşte daha karmaşık, ancak bellek verimli bir yol :
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]
Ve yine, MD5 bozulduğundan ve artık gerçekten kullanılmaması gerektiğinden:
[(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.sha256()))
for fname in fnamelst]
Yine, sadece 128 bitlik sindirim istiyorsanız [:16]
, çağrıdan sonra koyabilirsiniz hash_bytestr_iter(...)
.
md5sum
?