Anggap Anda memiliki fungsi hash yang mengambil string dengan panjang dan mengembalikan string dengan panjang dan memiliki properti bagus yang tahan benturan , yaitu sulit untuk menemukan dua string berbeda dengan hash yang sama .
Anda sekarang ingin membangun fungsi hash baru yang membutuhkan string dengan panjang sewenang - wenang dan memetakannya ke string dengan panjang , sambil tetap tahan tabrakan.
Beruntung bagi Anda, sudah pada tahun 1979 sebuah metode yang sekarang dikenal sebagai konstruksi Merkle-Damgård diterbitkan yang mencapai hal ini.
Tugas dari tantangan ini adalah untuk mengimplementasikan algoritma ini, jadi pertama-tama kita akan melihat deskripsi formal dari konstruksi Merkle-Damgård, sebelum melalui contoh langkah-demi-langkah yang seharusnya menunjukkan bahwa pendekatannya lebih sederhana daripada mungkin muncul pada awalnya.
Diberikan bilangan bulat , fungsi hash seperti yang dijelaskan di atas dan string input panjang sewenang-wenang, fungsi hash baru melakukan hal berikut:
- Set, Panjang , dan perpecahan dalam potongan panjang , mengisi potongan terakhir dengan tertinggal nol jika diperlukan. Ini menghasilkan banyak potongan yang diberi label .
- Tambahkan terkemuka dan trailing sepotong dan , di mana adalah string yang terdiri dari angka nol dan adalah dalam biner, empuk dengan terkemuka nol dengan panjang .
- Sekarang secara iteratif terapkan ke chunk saat ini ditambahkan ke hasil sebelumnya : , di mana . (Langkah ini mungkin lebih jelas setelah melihat contoh di bawah ini.)
- Output dari adalah hasil akhir .
Tugas
Tulis program atau fungsi yang mengambil input bilangan bulat positif , fungsi hash sebagai kotak hitam dan string yang tidak kosong dan mengembalikan hasil yang sama dengan pada input yang sama.
Ini adalah kode-golf , jadi jawaban tersingkat di setiap bahasa menang.
Contoh
Katakanlah , jadi fungsi hash yang diberikan mengambil string dengan panjang 10 dan mengembalikan string dengan panjang 5.
- Diberikan masukan dari , kita mendapatkan potongan-potongan berikut: , , dan . Perhatikan bahwa harus diisi hingga panjang 5 dengan satu nol di belakangnya.
- hanyalah string dari lima nol dan adalah lima dalam biner ( ), diisi dengan dua nol di depan.
- Sekarang potongan digabungkan dengan :
- adalah output kami.
Mari kita lihat bagaimana output ini akan tergantung pada beberapa pilihan 1 untuk :
- Jika , yaitu hanya mengembalikan setiap karakter kedua, kita mendapatkan:
Jadi perlu menjadi output jika itu diberikan sebagai fungsi kotak hitam.
- Jika hanya mengembalikan 5 karakter pertama dari inputnya, output dari adalah . Demikian pula jika mengembalikan 5 karakter terakhir, hasilnya adalah .
- Jika mengalikan kode karakter dari inputnya dan mengembalikan lima digit pertama dari angka ini, misalnya , maka .
1 Untuk kesederhanaan, itu sebenarnya tidak tahan tabrakan, meskipun ini tidak masalah untuk menguji kiriman Anda.
omgPzzles0
. Contoh input yang dipilih dengan baik!