あなたが持って考えてみましょうハッシュ関数 の長さの文字列を取るの長さの戻り文字列、それがあることを素敵なプロパティがある耐衝突、すなわち、見つけるのは難しいです二つの異なる文字列同じハッシュを持つ。
ここで、任意の長さの文字列を取得し、それらを長さnの文字列にマッピングする新しいハッシュ関数を作成します。
幸運なことに、すでに1979年に、Merkle–Damgård構造として知られる方法が公開されました。
この課題の課題は、このアルゴリズムを実装することです。そのため、アプローチがより簡単であることを示すステップバイステップの例に進む前に、最初にマークル・ダムガード構造の形式的な説明を見ていきます。最初に表示される場合があります。
いくつかの整数、上記のハッシュ関数および任意の長さ入力文字列sが与えられると、新しいハッシュ関数は次のことを行います。
- 設定、の長さ、および長さnのチャンクにを分割し、必要に応じて最後のチャンクを末尾のゼロで埋めます。この収率は、mは= ⌈ L標識されている多くのチャンク。
- リーディングを追加して、後続チャンクと、ここで、からなる文字列であり、ゼロとであり、バイナリで、で埋め主要長さにゼロ。
- 今反復適用現在のチャンクに、前の結果に添付:、。(このステップは、以下の例を見るとより明確になるかもしれません。)
- H ′の出力は、最終結果です。
タスク
入力として正の整数かかるプログラムや関数書き込み、ハッシュ関数としてブラックボックスおよび空でない文字列、H 'と同じ結果を返す、同じ入力で。
これはcode-golfであるため、各言語の最短の回答が優先されます。
例
レッツ・発言、そう私たちの与えられたハッシュ関数長さ5の長さ10とリターンの文字列の文字列を取ります。
- 入力所与、我々は、次のチャンクを取得:、、と。は、長さが5になるように、末尾にゼロが1つ埋め込まれる必要があることに注意してください。
- は5つのゼロのストリングであり、は5のバイナリ()であり、2つの先行ゼロが埋め込まれます。
- チャンクはと結合されます:
- は出力です。
のは、この出力は、いくつかの選択肢に応じて、どのように見えるかを見てみましょう1のための:
- 場合は、すなわちちょうど毎秒文字を返す、我々 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!