Tôi đang cố gắng thực hiện một cuộc tấn công va chạm vào băm (tôi đang truy cập khóa học 'mật mã'). Vì vậy, tôi có hai mảng băm (= byte-chuỗi byte[]
) và muốn tìm băm có trong cả hai mảng. Sau một số nghiên cứu và suy nghĩ rất nhiều, tôi chắc chắn rằng giải pháp tốt nhất trên máy đơn lõi sẽ là HashSet
(thêm tất cả các phần tử của mảng đầu tiên và kiểm tra qua contains
nếu các phần tử của mảng thứ hai đã có).Làm thế nào để tìm các byte giống nhau [] - các đối tượng trong hai mảng đồng thời?
Tuy nhiên, tôi muốn triển khai giải pháp đồng thời vì tôi có quyền truy cập vào máy có 8 lõi và RAM 12 GB. Giải pháp tốt nhất tôi có thể nghĩ là ConcurrentHashSet, có thể được tạo thông qua Collections.newSetFromMap(new ConcurrentHashMap<A,B>())
. Sử dụng cấu trúc dữ liệu này tôi có thể thêm tất cả các phần tử của mảng đầu tiên song song và - sau khi tất cả các phần tử được thêm vào - tôi có thể kiểm tra đồng thời qua contains
cho các băm giống nhau.
Vì vậy, câu hỏi của tôi là: Bạn có biết thuật toán được thiết kế cho vấn đề chính xác này không? Nếu không, bạn có kinh nghiệm sử dụng ConcurrentHashSet như vậy liên quan đến các vấn đề và thời gian chạy hiệu quả phức tạp không? Hoặc bạn có thể giới thiệu một cấu trúc dữ liệu dựng sẵn khác có thể giúp tôi không?
PS: Nếu có ai quan tâm đến chi tiết: Tôi định sử dụng Skandium để song song chương trình của mình.
Các mảng đã được sắp xếp chưa? Nếu đúng như vậy, tính năng hợp nhất một lần chuyển qua như chức năng sẽ tìm thấy các bản sao. Nếu không, bạn có thể sắp xếp mảng 1 và mảng2 song song và thực hiện hợp nhất trên các kết quả. – Ingo
By băm byte làm bạn có nghĩa là tất cả băm là trong khoảng 0-255? – Tudor
Tôi có nghĩa là chuỗi byte, tức là 'byte []'. Chúng là kết quả của hàm băm như SHA hoặc MD5. Không, các mảng không được sắp xếp. Việc sắp xếp và hợp nhất chúng sẽ cần O (n log n) để sắp xếp và O (n + m) để hợp nhất. Tôi hy vọng có hiệu quả cao hơn. –