Tôi xin mượn một câu chuyện để liên hệ với hai tình huống giải quyết vấn đề của chủ topic.
Tại một xã hẻo lảnh nọ xẩy ra một vụ cướp. Hung thủ trong lúc tháo chạy có đánh rơi một cái mũ có vài cọng tóc. Người ta xác định được là hung thủ chắc chắn là một trong số 10000 người sống tại cái xã này.
- Anh điều tra viên trẻ nêu cao kiến "Chỉ cần áp dụng công nghệ ADN tân tiến, tiến hành xét nghiệp toàn bộ tóc 10000 dân xã thì chắc chắn tên cướp sẽ không thể thoát được".
- Anh điều tra viên trung niên thì lại trầm ngâm "Bỏ công làm 10000 mẫu xét nghiệm ADN chắc cả năm chưa xong". Thế rồi anh quay sang nạn nhân cố tìm manh mối. Vì bị tấn công bất ngờ và trong trời nhập nhoạng nên nạn nhận chỉ nhớ là tên cướp đi cà nhắc. Thế là anh điều tra viên lọc ra tất cả những người trong xã đang đi cà nhắc và tìm ra 2 người khả nghi. Anh điều tra viên lại tìm gặp nạn nhân và hỏi "Chị có nhớ đặc điểm gì đặc biệt của tên cướp không, hắn cao tầm bao nhiêu, giọng nói thế nào?". Nạn nhân nhớ ra là tên này nói lắp. Thế là người ta dễ dàng tóm được tên cướp trong số 2 người cà nhắc.
Trường hợp dùng hàm băm chả khác gì dùng công nghệ ADN tân tiến để truy ra kẻ khả nghi duy nhất vậy. Dù rất chính xác nhưng cũng rất lâu. Còn nếu dùng nhận dạng đi cà nhắc, thì ngay lập tức sàng lọc được 2 đối tượng khả nghi - tức là sẽ có 1 đối tượng vô tội (sai số). Tiếp tục áp dụng thêm 1 điều kiện nhận dạng là tật nói lắp, người ta cuối cùng tóm được đúng tên cướp.
Phương cách của tôi cũng giống như cách truy tìm [2], nó cho ra một đáp án (có thể) có sai số nhưng nếu kết hợp thêm một điều kiện sàng lọc nữa thì sẽ tìm ra kết quả chính xác. Vậy thì những file có kích cỡ tương đồng sẽ là đối tượng có nguy cơ trùng cao và tôi sẽ lại đối chiếu thêm một thuộc tính nào của chúng để xác định. Chúng ta có thể dùng "Date Taken" hoặc "Date Modified" hoặc thuộc tính nào đó đối chiếu.
Xin nhắc lại kết quả phân tích trước đây của tôi sau khi thực nghiệm với hàm FileToSHA1Hex
- Hàm GetFileBytes() chiếm khoảng 20% thời gian (với HDD Thì tỷ lệ % có thể cao hơn)
- Hàm ComputeHash_2() ngốn tới 80% thời gian.
Nếu kỹ càng hơn, chúng ta sẽ dùng kết quả từ GetFileBytes() đối chiếu một số byte ở một số ví trị nhất định trong 2 file và độ chính xác sẽ
tiệm cận với hàm băm nhưng lại rút ngắn đi gần 80% thời gian thực thi code.