Làm thế nào tôi có thể nhận được MD5, SHA và các băm khác từ một tệp nhưng chỉ thực hiện một lần? Tôi có các tệp 100mb, vì vậy tôi không muốn xử lý các tệp 100MB đó nhiều lần.Làm cách nào tôi có thể tạo nhiều băm của một tệp chỉ bằng một lần truyền?
6
A
Trả lời
7
Đây là một sửa đổi @ʞɔıu
's answer sử dụng @Jason S
' suggestion.
from __future__ import with_statement
from hashlib import md5, sha1
filename = 'hash_one-pass.py'
hashes = md5(), sha1()
chunksize = max(4096, max(h.block_size for h in hashes))
with open(filename, 'rb') as f:
while True:
chunk = f.read(chunksize)
if not chunk:
break
for h in hashes:
h.update(chunk)
for h in hashes:
print h.name, h.hexdigest()
15
Điều gì đó giống như vậy?
>>> import hashlib
>>> hashes = (hashlib.md5(), hashlib.sha1())
>>> f = open('some_file', 'r')
>>> for line in f:
... for hash in hashes:
... hash.update(line)
...
>>> for hash in hashes:
... print hash.name, hash.hexdigest()
hoặc lặp trên f.read (1024) hoặc một cái gì đó như thế để có được khối cố định chiều dài
3
Tôi không biết Python nhưng tôi quen thuộc w/tính toán băm.
Nếu bạn xử lý việc đọc tệp theo cách thủ công, chỉ cần đọc trong một khối (256 byte hoặc 4096 byte hoặc bất kỳ thứ gì) tại một thời điểm và chuyển từng khối dữ liệu để cập nhật băm của mỗi thuật toán. (bạn sẽ phải khởi tạo trạng thái lúc bắt đầu và hoàn tất trạng thái ở cuối.)
Các vấn đề liên quan
- 1. Làm cách nào tôi có thể hợp nhất nhiều băm thành một băm trong Perl?
- 2. Làm thế nào tôi có thể tạo ra một băm dài của một String?
- 3. Làm cách nào tôi có thể tạo một hình thu nhỏ của một tệp PDF bằng SDK iPhone?
- 4. Đăng nhập một lần trên Facebook của Android - nhiều băm quan trọng có thể?
- 5. Làm thế nào tôi có thể in cùng một biến thành một chuỗi nhiều lần?
- 6. Làm cách nào tôi có thể lọc một mảng băm để chỉ lấy các khóa trong một mảng khác?
- 7. Làm thế nào tôi có thể băm một chuỗi vào một int bằng cách sử dụng c + +?
- 8. Làm thế nào tôi có thể gọi ViewDidAppear chỉ một lần?
- 9. Làm cách nào để tạo một bản tóm tắt băm MD5 từ một tệp văn bản?
- 10. Làm thế nào tôi có thể khởi tạo một đối tượng chỉ biết tên của nó?
- 11. Làm thế nào tôi có thể khởi tạo nhiều phiên bản của cùng một đối tượng trong Codeigniter?
- 12. Làm cách nào tôi có thể xem liệu một băm Perl đã có một khóa nhất định?
- 13. Làm thế nào tôi có thể kiểm tra DBNull trong khi thực hiện lệnh của tôi chỉ một lần?
- 14. Làm thế nào tôi có thể truyền một mảng làm tham số cho một hàm vararg?
- 15. Tôi có thể sử dụng lại một khối nhiều lần như thế nào?
- 16. Tạo một bản đồ băm bằng một khóa kép
- 17. Làm thế nào tôi có thể truyền một danh sách bằng Generics trong Java?
- 18. Làm cách nào tôi có thể nhận được băm của toàn bộ bảng trong postgresql?
- 19. Có cách nào để "yêu cầu" một tệp JS chỉ một lần trong các nút không?
- 20. Android - Tạo nhanh một Fragment nhiều lần?
- 21. Làm thế nào tôi có thể chia chuỗi chỉ một lần sử dụng C#
- 22. Cách thêm cùng một chế độ xem cho cha mẹ nhiều lần bằng cách tăng nó chỉ một lần
- 23. Cố ý tạo hai tệp để có cùng một băm?
- 24. Làm cách nào tôi có thể chỉ định CSS @media trong một tệp dao cạo?
- 25. Làm cách nào tôi có thể lấy tệp tininfo của tất cả các tệp trong một thư mục bằng GetFile()?
- 26. OpenMP - tạo chủ đề chỉ một lần
- 27. Làm thế nào tôi có thể tạo một nhánh trong svn bằng cách sử dụng SharpSVN
- 28. Làm cách nào tôi có thể chỉ định kết hợp biểu thức chính quy của tôi với một biến?
- 29. Làm thế nào tôi có thể chuyển một băm bằng cách sử dụng máy khách và máy chủ trong Perl?
- 30. Làm thế nào để băm một tập tin duy nhất nhiều cách cùng một lúc?
Đó có vẻ như nó sẽ làm việc nhưng tôi sẽ đọc byte sử dụng một kích thước khối cố định chứ không phải là một cơ sở cho mỗi dòng (một số tập tin nhị phân có thể không chứa ngắt dòng) –
f.readlines() yêu cầu ~ 100MB, nhưng một tác phẩm 'f' đơn thuần (đối tượng tệp là một trình lặp trên các dòng trong Python) – jfs
' cho dòng trong f' lặp lại trên * dòng * trong tệp. nếu kích thước đường là 1MB thì không quan trọng bạn sử dụng kích thước bộ đệm nào; len (dòng) sẽ là 2 ** 20. Do đó tham số thứ 3 cho 'mở()' không hữu ích trong trường hợp này. – jfs