Розглянемо, що у вас є хеш-функція яка займає рядки довжиною і повертає рядки довжиною і має приємне властивість, що вона є стійкою до зіткнення , тобто важко знайти дві різні рядки з той же хеш .
Тепер ви хочете побудувати нову хеш-функцію яка займає рядки довільної довжини і відображає їх у рядки довжиною , зберігаючи стійкість до зіткнення.
Пощастило вам, вже в 1979 році був опублікований метод, відомий під назвою конструкція Меркле - Дамгор, який досягає саме цього.
Завданням цієї задачі буде реалізація цього алгоритму, тому ми спочатку ознайомимось з офіційним описом конструкції Меркле - Дамґер, перш ніж переглядати покроковий приклад, який повинен показати, що підхід простіший, ніж це може з’явитися спочатку.
Враховуючи деяке ціле число , хеш-функцію як описано вище, і вхідний рядок довільної довжини, нова хеш-функція виконує наступне:
- Встановити, довжина і розділити на шматки довжиною , заповнивши при необхідності останній відрізок іззадніминулями. Це даєбагато шматок, які позначаються.
- Додайте провідний і кінцевий відрізок і , де - це рядок, що складається з нулів, а - двійкових, підкладених ведучими нулями на довжину .
- Тепер ітеративно застосуйте до поточного відрізку доданого до попереднього результату : , де . (Цей крок може бути більш зрозумілим, переглянувши приклад нижче.)
- Вихід - кінцевий результат .
Завдання
Напишіть програму або функцію, яка приймає як вхід додатне ціле число , хеш-функцію як чорний ящик і не порожній рядок і повертає той самий результат, що і на ті самі входи.
Це код-гольф , тому найкоротша відповідь на кожній мові виграє.
Приклад
Скажімо, , тому наша задана хеш-функція приймає рядки довжиною 10 і повертає рядки довжиною 5.
- Враховуючи вхід , ми отримуємо такі фрагменти: , , і . Зауважте, що потрібно прокласти до довжини 5 з одним кінцевим нулем.
- - це лише рядок з п'яти нулів, а - п'ять у двійковій ( ), обкладеній двома провідними нулями.
- Тепер шматки поєднуються з :
- - наш вихід.
Давайте подивимось, як виглядатиме цей вихід залежно від варіантів 1 для :
- Якщо , тобто просто повертає кожен другий символ, отримуємо:
Отже, повинен бути результатом, якщо такий задається як функція чорного поля. - Якщо просто повертає перші 5 символів свого введення, вихід становить . Аналогічно, якщо повертає останні 5 символів, вихід .
- Якщо помножує коди символів свого введення і повертає перші п’ять цифр цього числа, наприклад , то .
1 Для простоти ці насправді не стійкі до зіткнень, хоча це не має значення для тестування ваших даних.
omgPzzles0
. Добре обраний приклад введення!