Eğer bir var düşünün karma işlevi uzunluğu dizeleri alır ve getiri uzunluğu dizeleri ve onu olduğu güzel bir özelliği vardır dirençli çarpışma , yani iki farklı dizeleri bulmak zor ile aynı karma .
Artık , çarpışmalara karşı dirençli olurken , keyfi uzunluktaki dizeleri alıp uzunluktaki dizelerle eşleyen yeni bir karma işlev oluşturmak istiyorsunuz .
Şanslısınız, zaten 1979'da Merkle-Damgård inşaatı olarak bilinen ve tam olarak bunu başaran bir yöntem yayınlandı.
Bu zorluğun görevi bu algoritmayı uygulamak olacak, bu yüzden yaklaşımın daha basit olduğunu göstermesi gereken adım adım bir örnek geçmeden önce Merkle-Damgård yapısının resmi bir tanımına bakacağız. ilk başta görünebilir.
Bazı tamsayısı , yukarıda açıklandığı gibi bir karma işlevi ve keyfi uzunlukta bir giriş dizesi verildiğinde, yeni karma işlevi şunları yapar:
- Set, uzunluğunu ve uzunluğundaki parçalar halinde bölün , gerekirse son parçayı sondaki sıfırlarla doldurun. Bu, olarak etiketlenmiş birçok .
- Ekleme lider ve bir arka yığın ve , oluşan bir dizi olup sıfır ve olduğu ile şişirilir, ikili olarak gelen uzunluğu sıfır .
- Şimdi , önceki sonuca eklenen geçerli yinelemeli olarak uygulanır : , burada . (Aşağıdaki örneğe baktıktan sonra bu adım daha açık olabilir.)
- çıktısı nihai sonuç .
Görev
Giriş olarak bir pozitif tamsayıyı alan bir program ya da işlev Yazın , bir karma işlev olarak kara kutu ve boş olmayan bir dizge ve geri dönüş aynı sonuç olarak aynı girdilere.
Bu kod golf , bu yüzden her dilde en kısa cevap kazanır.
Misal
Diyelim ki , bu yüzden verilen hash fonksiyonumuz 10 uzunluktaki dizeleri alır ve 5 uzunluktaki dizeleri döndürür.
- Bir giriş verilen , aşağıdaki parçaları almak: , , ve . , bir sıfır sonunda 5 uzunluğuna kadar doldurulması gerektiğini unutmayın .
- yalnızca beş oluşan bir dizedir ve ikili olarak beştir ( ) ve iki önde gelen sıfırla doldurulmuştur.
- Şimdi parçalar ile birleştirilmiştir :
- .
için bazı seçimler 1'e bağlı olarak bu çıktının nasıl görüneceğine bir göz atalım :
- Eğer , yani sadece her saniye karakteri döndürür elde ederiz:
Yani böyle ise, çıkış olması gerekmektedir kara kutu fonksiyonu olarak verilir.
"Pe011" - Eğer sadece kendi girişi ilk 5 karakter, çıkış döner olan . Benzer şekilde son 5 karakteri döndürürse, çıktı .
- Eğer çarpar bir karakterin giriş kodları ve döner bu numaranın ilk beş basamaklı, örneğin , daha sonra .
1 Basitlik açısından, bu aslında çarpışmaya karşı dayanıklı değildir, ancak bu, gönderiminizi test etmek için önemli değildir.
omgPzzles0
. İyi seçilmiş örnek giriş!