ハッシュ関数とは何ですか？
コンピュータサイエンス全般で使われているものです｡
ハッシュ関数とは､ 簡単に言えば､ 入力があるごとに一定の長さの値を生成する関数である｡
わかりました｡
どういう意味ですか？
さて､ ここでMD5ハッシュジェネレータを紹介します｡
MD5はハッシュ関数の種類で､ SHA1､ SHA256など聞いたことがあるような種類がたくさんあります｡
このハッシュ関数を用いて
そうしたらどうなるか､ 見てみましょう｡
こんにちは｡
すぐにわかりますね｡
MD5はこの文字列をハッシュ化し､ このような意味不明なものに変えてしまう｡
それがハッシュ関数である｡
入力を与えると､ この関数は何らかのランダムなパターンを生成する｡
さて､ ハッシュ関数にはいくつかの重要なポイントがあります｡
第一は､ 一方通行であること｡
誰かにこれを渡しても､ 何がインプットされたのかわからないという意味で｡
そして､ その入力の手がかりを得ることは､ 実質的に不可能なのです｡
もうひとつは､ 何度helloを入れても同じになるということです｡
でも､ 私は何かひとつ変えるとすぐに､ アウトプットがまったく変わってしまうんです｡
ハローとに戻れば｡
大文字のHに変えただけの私を見よ､ 大文字でもいい｡
だから､ 5つのDから始まり､ 大文字のHにすると､ また全然違うものになるんです｡
そして､ これを見ると､ 少なくともそう言えるのです｡
うーん｡
これが何に役立つのかわかりませんが､ ひとつだけわかっているのは､ 何があっても､ 同じ入力をすれば同じ結果が得られるということです｡
しかし､ これをどのように変換して戻せばいいのかがわからない｡
こんにちは｡
これが独立型､ インディペンデント型と呼ばれるものです｡
発音が違うんですよ｡
どれがどれだかよくわからないが､ ある入力を与えられた関数は常に同じ出力をする､
という洒落た言い方である｡
さて､ なぜこれをデータ構造で使おうと思ったかというと､ データアクセスが非常に高速になるからです｡
ブドウやバスケットのドットブドウを見つけるには､ MD5ハッシュのようなものにブドウを渡すだけでよいからです｡
この番号を生成してくれるので､ うちのパソコンのメモリのどこにあるのかがすぐにわかるんです｡
でも､ これって住所っぽくないですよね？
技術的には､ ハッシュテーブルに使われるハッシュ関数は､ ブドウを受け取って､ ある種の意味意味不明なものを生成し､
この数字に基づいてインデックス空間またはアドレス空間に変換することになります｡
ハッシュテーブルで順序付きインデックスを持つだけのレースと違って､ キーを与えるだけで､ その項目がメモリ内のどこにあるかが正確にわかるんですね｡
しかし､ このブラックボックスのハッシュ関数､ 動作が遅くなるのではと疑問に思われるかもしれません｡
なぜなら､ 毎回､ プロパティを追加したいからです｡
そして､ ハッシュテーブルに値の葡萄と10,000｡
それをハッシュ関数にかけることで､ メモリ内のどこに置くかを決めるのです｡
そして､ そのグッジョブに気づいたとしたら､ それは大きな要因です｡
なぜなら､ メモリにプロパティを追加するたび､ あるいはメモリにプロパティを取得するたびに､
2回ともキーのブドウをハッシュ関数に送って､ どこから取得するのかを探すからです｡
本当に､ 本当に速くする必要があるんです｡
そして､ その裏側では､ ハッシュテーブルはあらゆる言語に存在するため､ 最適なハッシュ関数で実装されており､
本当に､ 本当に速いんです｡
余談ですが
SHA256のようなハッシュ関数は､ ハッシュの生成に実に長い時間がかかる｡
そして､ これは複雑すぎるハッシュ関数で､ 暗号のような､ これに時間をかけたい場所で多く使われていますが､
それはこの講座の範囲外です｡
もし興味があれば､ この2つの違いを確認することをお勧めします｡
見直すこと｡
ブドウのキーがあるんです｡
それをハッシュ関数に通して､ 高速にハッシュ化し､ そのハッシュをメモリアドレスにマッピングして保存するのです｡
データはブドウ1万個です｡
また､ ハッシュ関数に関しては､ 通常､ 使用しているフレームワークや言語に任せることになります｡
そして､ これは本当に速く起こることなので､ 通常､ 時間複雑性または大きな古い表記を想定しています｡
わかりました｡
さて､ このブラックボックスの役割を理解したところで､ ハッシュテーブルについてもう少し詳しく説明しましょう｡