พิจารณาคุณมีฟังก์ชันแฮช ซึ่งจะใช้เวลาสตริงที่มีความยาวและผลตอบแทนสตริงของความยาวและมีคุณสมบัติที่ดีที่ว่ามันเป็นทนชนคือมันยากที่จะหาสองสายที่แตกต่างกันกับกัญชาเดียวกัน )
คุณจะตอนนี้เช่นการสร้างฟังก์ชันแฮชใหม่ซึ่งจะมีสายยาวโดยพลการและแผนที่พวกเขาที่จะสตริงของความยาวในขณะที่ยังคงความทนต่อการปะทะกัน
โชคดีสำหรับคุณในปี 1979 วิธีที่รู้จักกันในชื่อMerkle – Damgårdได้รับการตีพิมพ์ซึ่งประสบความสำเร็จอย่างแน่นอน
ภารกิจของความท้าทายนี้คือการใช้อัลกอริทึมนี้ดังนั้นก่อนอื่นเราจะมาดูคำอธิบายอย่างเป็นทางการของการก่อสร้าง Merkle – Damgårdก่อนที่จะผ่านตัวอย่างทีละขั้นตอนซึ่งควรแสดงว่าวิธีการนั้นง่ายกว่า มันอาจปรากฏขึ้นในตอนแรก
รับจำนวนเต็ม , ฟังก์ชันแฮชตามที่อธิบายไว้ข้างต้นและสตริงอินพุตของความยาวโดยพลการฟังก์ชันแฮชใหม่ทำดังต่อไปนี้:
- ตั้งความยาวของและแยกในหน่วยความยาวเติมก้อนสุดท้ายด้วยศูนย์ต่อท้ายหากจำเป็น สิ่งนี้ให้ผลชิ้นส่วนมากมายที่มีป้ายกำกับเมตร
- เพิ่มส่วนนำและส่วนท้ายและโดยที่คือสตริงที่ประกอบด้วยศูนย์และคือในแบบไบนารีเพิ่มด้วยศูนย์นำไปจนถึงความยาว n
- ตอนนี้ใช้ซ้ำกับก้อนปัจจุบันผนวกเข้ากับผลลัพธ์ก่อนหน้า : ที่ 0 (ขั้นตอนนี้อาจชัดเจนกว่านี้หลังจากดูตัวอย่างด้านล่าง)
- การส่งออกของเป็นผลสุดท้าย 1
งาน
เขียนโปรแกรมหรือฟังก์ชั่นซึ่งจะเป็น input เป็นจำนวนเต็มบวก , ฟังก์ชั่นกัญชาเป็นกล่องสีดำและสตริงไม่ว่างเปล่าและผลตอบแทนเช่นเดียวกับในปัจจัยการผลิตเดียวกัน
นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดในแต่ละภาษาจะเป็นผู้ชนะ
ตัวอย่าง
สมมติว่าดังนั้นฟังก์ชันแฮชของเราได้รับใช้เวลาสตริงที่มีความยาว 10 และผลตอบแทนของความยาวสาย 5
- ได้รับการป้อนข้อมูลของที่เราได้รับชิ้นต่อไปนี้: , , และ "zles0" โปรดทราบว่าจะต้องมีการบุนวมให้ยาว 5 พร้อมกับหนึ่งศูนย์ต่อท้าย
- เป็นเพียงสตริงห้าศูนย์และคือห้าในเลขฐานสอง ( ) ซึ่งมีสองศูนย์นำหน้า
- Now the chunks are combined with :
- is our output.
Let's have a look how this output would look depending on some choices1 for :
- If , i.e. just returns every second character, we get:
So needs to be the output if such a is given as black box function. - If simply returns the first 5 chars of its input, the output of is . Similarly if returns the last 5 chars, the output is .
- If multiplies the character codes of its input and returns the first five digits of this number, e.g. , then .
1 For simplicity, those are actually not collision resistant, though this does not matter for testing your submission.
omgPzzles0
. Well chosen example input!