Có một cách mà bộ nhớ khá kém hiệu quả .
tập tin duy nhất:
import hashlib
def file_as_bytes(file):
with file:
return file.read()
print hashlib.md5(file_as_bytes(open(full_path, 'rb'))).hexdigest()
danh sách các tập tin:
[(fname, hashlib.md5(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
Mặc dù vậy, hãy nhớ lại rằng MD5 đã bị hỏng và không nên được sử dụng cho bất kỳ mục đích nào vì phân tích lỗ hổng có thể rất khó khăn và việc phân tích bất kỳ việc sử dụng nào có thể xảy ra trong tương lai mà mã của bạn có thể được đưa ra cho các vấn đề bảo mật là không thể. IMHO, nó nên được gỡ bỏ khỏi thư viện để mọi người sử dụng nó buộc phải cập nhật. Vì vậy, đây là những gì bạn nên làm thay thế:
[(fname, hashlib.sha256(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
Nếu bạn chỉ muốn tiêu hóa 128 bit, bạn có thể làm .digest()[:16]
.
Điều này sẽ cung cấp cho bạn một danh sách các bộ dữ liệu, mỗi bộ chứa tên của tệp và hàm băm của nó.
Một lần nữa tôi mạnh mẽ đặt câu hỏi về việc bạn sử dụng MD5. Bạn ít nhất nên sử dụng SHA1, và đưa ra các lỗ hổng gần đây được phát hiện trong SHA1 , thậm chí có thể không phải như vậy. Một số người nghĩ rằng miễn là bạn không sử dụng MD5 cho mục đích 'mật mã', bạn vẫn ổn. Nhưng công cụ có xu hướng kết thúc phạm vi rộng hơn bạn mong đợi ban đầu, và phân tích lỗ hổng thông thường của bạn có thể chứng minh hoàn toàn thiếu sót. Tốt nhất là hãy tập thói quen sử dụng thuật toán phù hợp ngoài cổng. Chỉ cần gõ một loạt các chữ cái khác nhau là được. Nó không khó lắm đâu.
Đây là một cách phức tạp hơn, nhưng hiệu quả bộ nhớ :
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]
Và, một lần nữa, vì MD5 bị hỏng và không thực sự được sử dụng nữa:
[(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.sha256()))
for fname in fnamelst]
Một lần nữa, bạn có thể đặt [:16]
sau cuộc gọi đến hash_bytestr_iter(...)
nếu bạn chỉ muốn tiêu hóa 128 bit.
md5sum
?