えっと。始めに話を受けた方から
「ハッシュ関数」とは何か。
「一方向ハッシュ関数」とは何か。
「一方向性」とは何か。
について個別に触れようとしてないのが全然ダメ。
というお話を頂いて。…なんとなく「どの辺に引っかかっていたのか」を色々と考察してみます。
ここで。とりあえずポイントとしては
- 不可逆
- 一方向性
の二つの言葉の定義でしょうか?
不可逆はまぁそのまんまなので省略します。
で…ちと一方向性について調べてみたりするのですが。
一方向性関数とは、関数の中でも、間単に計算できるが逆関数の逆関数の計算が非常に困難である(もしくは不可能である)ような関数のことである。
一方向性関数(いちほうこうせいかんすう, oneway function)とは、簡単に計算できるが逆関数の計算は非常に困難である関数の事。
このあたりから公約数的な発想をすると…
hoge = 関数(でぇた)
があるときにおいて。
っていうのが恐らくは定義としてあるのではないか、と思われるです。
で…「不可逆」である以上、逆算は(データがつぶれてるから)不可能なはずなので。真っ当な手段「ではなく」アタック的手法で逆算したとして、その値が「衝突するほかのデータではない」保障もないですし。
この観点からすると、ハッシュ関数はすべからく一方向性関数になると思われます。そこから「一方向性ハッシュ関数」という呼称が出てきたのだろうとは十分に予測が出来るのですが(そういった用語使用例も、ネットを見ている限りでは多いですし)。
ただ、ここで微妙に気になるのが。
「一方向性関数」ではなくて「一方向性ハッシュ関数」とした場合の定義が、場所によっては
一方向性ハッシュ関数は、衝突を起こしにくい圧縮関数hのことをいいます。ここでいう衝突とは、異なるx1、x2に対してh(x1)=h(x1)となることです。
という風に「値の逆算の不可能性/困難性」ではなく「衝突を起こしにくい、或いは衝突を見つけにくい」という部分に言及してある場合があることです(ケース的には少ないように感じられましたが。とりあえず1件しか見つけられてないので)。
で。もし前述のMixiの方の発言が、この定義を元に「衝突耐性の強度如何によっては"一方向性ハッシュ関数ではない"」と定義されるなら………わからなくも、ないです。
ただ…「一方向性関数」からの派生語としての「一方向性ハッシュ関数」を考えた場合に、衝突の強度の有無(しかも基準がもう一つ微妙)を前提にするのは…ちょっと難しいように思うのですが。どうなんでしょうかねぇ?