MD5 là một thuật toán lặp lại. Bạn không cần phải tính toán một tấn MD5 nhỏ và sau đó kết hợp chúng bằng cách nào đó. Bạn chỉ cần đọc các phần nhỏ của tệp và thêm chúng vào thông báo khi bạn đang đi, vì vậy bạn không bao giờ phải có toàn bộ tệp trong bộ nhớ cùng một lúc. Đây là một triển khai java.
FileInputStream f = new FileInputStream(new File("bigFile.txt"));
MessageDigest digest = MessageDigest.getInstance("md5");
byte[] buffer = new byte[8192];
int len = 0;
while (-1 != (len = f.read(buffer))) {
digest.update(buffer,0,len);
}
byte[] md5hash = digest.digest();
Et voila. Bạn có MD5 của toàn bộ tệp mà không bao giờ có toàn bộ tệp trong bộ nhớ cùng một lúc.
Cần lưu ý rằng nếu vì lý do nào đó bạn muốn MD5 băm phần phụ của tệp khi bạn đi (điều này đôi khi hữu ích khi thực hiện kiểm tra tạm thời trên một tệp lớn được chuyển qua kết nối băng thông thấp) thì bạn có thể nhận được chúng bằng cách nhân bản đối tượng tiêu hóa bất cứ lúc nào, như vậy
byte[] interimHash = ((MessageDigest)digest.clone()).digest();
này không ảnh hưởng đến thực tế tiêu hóa đối tượng, do đó bạn có thể tiếp tục làm việc với các hash MD5 tổng thể. Nó cũng đáng chú ý là MD5 là một băm lỗi thời cho các mục đích mã hóa (như xác minh tính xác thực của tập tin từ một nguồn không đáng tin cậy) và nên được thay thế bằng một cái gì đó tốt hơn trong hầu hết các trường hợp, chẳng hạn như SHA-1. Đối với các mục đích không mã hóa, chẳng hạn như xác minh tính toàn vẹn của tệp giữa hai nguồn đáng tin cậy, MD5 vẫn còn đầy đủ.
Tại sao bạn muốn làm điều đó? – AndiDog
Để tính giá trị MD5 cho các tệp quá lớn để vừa trong bộ nhớ – channel72
MD5 chỉ có trạng thái 128 bit theo dõi đoạn tệp 512 bit trong khi tính toán; ai quan tâm đến tệp lớn như thế nào? –