Tôi muốn tạo một cách nhanh chóng để phát hiện xem một tệp có thể giống nhau hay không. Đối với sự chắc chắn gần như 100%, tôi sẽ sử dụng thuật toán băm hiện có, ví dụ SHA256. Tuy nhiên, các tệp được dự kiến là các tệp video khổng lồ với vài GB, do đó, việc tính toán hàm băm SHA256 có thể mất một thời gian, đặc biệt là qua mạng.
Vì vậy, tôi muốn kết hợp các kỹ thuật khác nhau:
- kích thước tệp: nếu kích thước tệp đã thay đổi, nội dung đã thay đổi (chắc chắn)
- băm đầu / đuôi
- băm ngẫu nhiên
2 cái sau là một phần câu hỏi của tôi:
Tôi đoán là trong tiêu đề có những thứ như:
- tốc độ khung hình (ví dụ Video)
- độ phân giải (ví dụ: Video, Hình ảnh)
- (tệp) chiều dài (ví dụ: trong khung, pixel, v.v.)
- ngày thay đổi cuối cùng (ví dụ: tài liệu Word, không cụ thể là Video)
Tại sao tôi xem xét việc kiểm tra đuôi là:
- MP3 có thông tin thẻ ở đó
- EXIF thêm dữ liệu tùy chỉnh vào cuối nếu tôi đúng
Băm ngẫu nhiên sẽ chọn ví dụ 126 vùng tại các vị trí ngẫu nhiên trong tệp có độ dài cụ thể, ví dụ 64 kB và tạo hàm băm cho chúng. Tất nhiên tôi nhớ các offset để so sánh sau. Tất cả trong tất cả tôi sẽ sử dụng (1 + 126 + 1) * 64 kB dữ liệu cho hàm băm của mình, vì vậy tôi chỉ cần đọc 8 MB thay vì vài GB để có được hàm băm.
Có thể bây giờ đây là câu hỏi Toán học nhiều hơn, nhưng: khả năng phát hiện thay đổi bằng cách sử dụng kết hợp kích thước tệp, đầu, đuôi và dữ liệu ngẫu nhiên để tạo ra tổng băm nhanh này?
Tôi giả định rằng các tập tin luôn luôn là tập tin hợp pháp. Không có lợi ích trong việc thao tác các byte đơn. Người dùng sẽ sử dụng một công cụ chỉnh sửa video bình thường để thay đổi các tập tin.
CẬP NHẬT : Tôi không chấp nhận câu trả lời này xuất phát từ Crypto.StackExchange. Tôi đồng ý rằng đề xuất của tôi không phải là mật mã và không có ý định bảo mật. Tôi cũng đồng ý rằng CRCing một tệp là nhanh, nhưng trong trường hợp của tôi, tôi thực sự cần một hàm băm - tôi sẽ giải thích lý do:
- Ứng dụng của tôi dự kiến sẽ lưu dấu trang trong video. Cơ sở dữ liệu của tôi dự kiến sẽ lưu băm video và dấu trang.
- Người dùng đôi khi di chuyển hoặc đổi tên tập tin. Chương trình của tôi sẽ nhận thấy rằng một tệp không còn tồn tại, nhưng sẽ không xóa các dấu trang khỏi cơ sở dữ liệu. Thay vào đó, khi cùng một video (vô tình) được phát lại, tôi muốn nhận ra rằng đó (có thể) cùng một tệp.
- Người dùng dự kiến sẽ lưu các tệp trên ổ đĩa mạng (NAS) và truyền phát video. Đó là những kho câm. Tôi không thể cài đặt một thành phần máy chủ. Và chúng có thể khá chậm, vì vậy tôi thực sự không muốn băm đầy đủ. Việc tính toán hàm băm đầy đủ trên tệp 3 GB mất ít nhất 5 phút @ 10 MB / s, bất kể thuật toán băm nhanh như thế nào.
- Nếu người dùng đã chỉnh sửa tệp, bằng cách nào đó tôi hy vọng rằng hàm băm sẽ không khớp nữa, vì nếu không tôi sẽ hiển thị dấu trang sai.
Tôi sẽ ổn với ~ 80% cơ hội có các dấu trang chính xác. Có bao nhiêu phần băm tôi nên đặt cùng nhau và vị trí trong tệp sẽ ở đâu?