Tôi đọc câu hỏi này: Bẻ khóa $f(x) = Cx \oplus Dx$
Hỏi về việc tìm kiếm các xung đột trong một hàm băm 64 bit đơn giản và tôi nghĩ rằng tôi sẽ tự mình thử chỉ để giải trí.
Tôi nhanh chóng viết mã để tìm va chạm:
https://gist.github.com/meirmaor/b0e59352eb73cacec47d0f95c25a25fc
Tuy nhiên, nó tìm thấy nhiều va chạm gần và không có va chạm hoàn toàn, điều này gây trở ngại cho tôi.
Mô tả thuật toán:
Tôi muốn giải quyết vấn đề này bằng 8GB Ram, vì vậy tôi phân bổ hai mảng Int có độ dài $2^{30}$ *(4 byte int) mỗi cái.
Tôi điền chúng bằng cách băm các giá trị Int, tôi lấy 30 bit thấp hơn làm chỉ mục vào cả hai mảng và lưu trữ 32 bit trên cùng trong mảng đầu tiên và int nguồn trong mảng thứ hai.
tôi cư sử dụng $2^{32}$ các giá trị Int có thể (dưới dạng mảng byte) và nhận được tỷ lệ lấp đầy 98% như mong đợi, thay đổi gần với tỷ lệ lý tưởng hóa $1-e^{-4}$ Tôi mong chờ.
Nó giống như một bảng băm nhưng tôi không xử lý xung đột, chỉ giữ một giá trị duy nhất cho mỗi khóa băm 30 bit. Về cơ bản, đây là ánh xạ giữa hàm băm 62 bit bị cắt ngắn thành gốc 32 bit.
Sau đó, tôi thử băm các giá trị dài hơn với tiền tố Int bổ sung và tìm kiếm các xung đột, một lần nữa sử dụng 30 bit thấp hơn làm chỉ mục cho mảng, kiểm tra xem 32 đầu có khớp không và chúng tôi có tìm thấy xung đột gần không. Tuy nhiên, khi xác minh chúng, tôi thấy không có va chạm hoàn toàn, cho đến nay tôi đã tìm thấy hơn 60 va chạm gần, xác thực chúng một cách riêng biệt, chúng thực sự khớp ở 62 hoặc 63 bit, nhưng tôi đã mong đợi 1/4 là va chạm hoàn toàn, tôi nhận được 0.
Tôi đã lặp lại thử nghiệm hai lần trước tiên so sánh các giá trị băm 4 byte với giá trị băm 8 byte bắt đầu bằng các byte {số nhỏ,0,0,0}. Sau đó, tôi đã thử so sánh các giá trị băm có độ dài bằng nhau bằng cách điền trước các giá trị băm của dữ liệu bắt đầu bằng chuỗi byte {1,0,0,0} và so sánh lại với tiền tố {2+,0,0,0}
Làm thế nào là điều này có thể, một cái gì đó đặc biệt trong hàm băm này? Một lỗi lạ trong mã của tôi cho phép tôi tìm thành công các va chạm gần nhưng không có va chạm đầy đủ?
Có lý do nào khiến các vụ va chạm được tìm thấy theo cách này sẽ không biến thành các vụ va chạm hoàn toàn không.
Một ví dụ về một vụ va chạm gần được tìm thấy (tôi có nhiều):
Mảng(24, 0, 0, 0, 14, 103, 61, 80) so với
Mảng(1, 0, 0, 0, -2, -81, 79, 79)