この問題は明らかにPです。
勿論、$P=NP$かもしれませんが。
hashって、適当に復号した時に
「復号された部分が復号の必要条件に近いが、必要条件ですらない」
ことを利用していますよね。
必要条件に近い、というのは、サンプルケースを無数に用意すれば、
「必要条件である」
というのと殆ど変わらないですよね。
そして、必要条件を満たす場合を沢山集めてくると、それは十分条件に近付いていきます。それで解くことができます。
正しく解けた部分を○、正しくなかった部分を×とします。ワンセットで5回、5文字の復号を試行します。
1回目
○××××
2回目
××××○
そうしたら、1回目のように始めの1文字を正しく復号した時のデータを死ぬ程集めてきます。データの量が多ければ、正しい復号の方法のデータが含まれます。
これを全ての文字で行い、複数の文字を正しく復号したデータをピックアップしていきます。
後は、時間を掛けてデータを選別します。
まず、costとパスワードとhashの組み合わせを用意する。適当に逆関数を作る。
正しく復号された部分以外の情報を捨てながらデタラメに復号する。
どの情報が正しいかは分からないけど、数があればどれが正しい復号かは何となく分かる。
ディープラーニングのように学習させればいい。
costを高くするのは意味がないと思う。
saltの情報は未知の変数として置く。
あまり意味がない。costを高くした方がマシ。ディープラーニングなら何とでもなる。
まず何らかの方法でパスワードとhash,costの組み合わせのデータを得ればいい。
今やってみて出来なかった人は、パラメータを変えてみて。
罰則を成功する確率が高い時はほぼゼロ、ムチャクチャ低い時はムチャクチャ高くする。
社会で一番大事なのは、失敗した時に責任を取ること……ではない!
一番大事なのは、失敗しないことだ。
今失敗しやすい試行は「無能な人間のデタラメ」、
成功しやすい試行は有能な人間の前向きな行動だとする。
成功しやすい試行は何度もトライする価値がある。
実社会では成功するかも分からないようなデタラメなことをやっても責任を取らない人間ののさばる会社は潰れてしまう。それと一緒だ。
要するに、無闇にhashを利用するのは危険だということだ。