Hãy xem xét bạn có hàm băm , lấy các chuỗi có độ dài và trả về các chuỗi có độ dài và có đặc tính tốt là nó có khả năng chống va chạm , nghĩa là khó tìm thấy hai chuỗi khác nhau với cùng băm .
Bây giờ bạn muốn xây dựng hàm băm mới , lấy các chuỗi có độ dài tùy ý và ánh xạ chúng thành các chuỗi có độ dài , trong khi vẫn có khả năng chống va chạm. n
May mắn cho bạn, đã có vào năm 1979, một phương pháp được biết đến với tên gọi xây dựng Damkård Merkle đã được xuất bản, đạt được chính xác điều này.
Nhiệm vụ của thử thách này sẽ là thực hiện thuật toán này, vì vậy trước tiên chúng ta sẽ xem xét một mô tả chính thức về cấu trúc MerkleTHER Damgård, trước khi đi qua một ví dụ từng bước sẽ cho thấy cách tiếp cận đơn giản hơn nó có thể xuất hiện lúc đầu
Cho một số nguyên , hàm băm như được mô tả ở trên và một chuỗi đầu vào có độ dài tùy ý, hàm băm mới thực hiện như sau:
- Đặt, chiều dài của và chia thành các đoạn có độ dài , điền vào đoạn cuối cùng với các số 0 ở cuối nếu cần. Điều này mang lại nhiều khối được gắn nhãn .m = ⌈ l
- Thêm một đoạn đầu và một đoạn cuối và , trong đó là một chuỗi bao gồm số không và là ở dạng nhị phân, được đệm bằng các số 0 dẫn đến độ dài .n
- Bây giờ lặp lại áp dụng cho đoạn hiện tại nối với kết quả trước đó : , trong đó . (Bước này có thể rõ ràng hơn sau khi xem ví dụ bên dưới.)
- Đầu ra của là kết quả cuối cùng .
Nhiệm vụ
Viết một chương trình hoặc chức năng mà mất như là đầu vào một số nguyên dương , một hàm băm như hộp đen và một chuỗi không rỗng và trả về kết quả tương tự như trên đầu vào tương tự.
Đây là môn đánh gôn , vì vậy câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng.
Thí dụ
Giả sử , vì vậy hàm băm đã cho của chúng tôi lấy các chuỗi có độ dài 10 và trả về các chuỗi có độ dài 5.
- Đưa ra đầu vào của , chúng tôi nhận được các đoạn sau: , , và . Lưu ý rằng cần được đệm đến chiều dài 5 với một số 0 ở cuối.
- chỉ là một chuỗi gồm năm số không và là năm số nhị phân ( ), được đệm bằng hai số 0 đứng đầu.
- Bây giờ các khối được kết hợp với :
- là đầu ra của chúng tôi.
Chúng ta hãy xem đầu ra này trông như thế nào tùy thuộc vào một số lựa chọn 1 cho :
- Nếu , tức là chỉ trả về mỗi ký tự thứ hai, chúng tôi nhận được:
Vì vậy, cần phải là đầu ra nếu một được đưa ra dưới dạng hàm hộp đen.
"Pe011" - Nếu chỉ trả về 5 ký tự đầu tiên của đầu vào, thì đầu ra của là . Tương tự nếu trả về 5 ký tự cuối cùng, đầu ra là .
- Nếu nhân mã số ký tự của đầu vào của nó và trả về năm chữ số đầu tiên của số này, ví dụ , sau đó .
1 Để đơn giản, những thực sự không có khả năng chống va chạm, mặc dù điều này không quan trọng để kiểm tra trình của bạn.
omgPzzles0
. Ví dụ đầu vào cũng được chọn!