インターネットでデータを送受信するときに、受信途中でデータが壊れていると律儀に
「データが壊れています」
と表示されますよね。
長時間かけてダウンロードしたのにー!
…と泣きたくなるときもありますが(笑
パソコンは送られてきたデータが壊れているとどうやって気づいているのでしょうか。
キーワードは「ハッシュ値」です。
ハッシュ値とは具体的になに?
どんなデータでも、パソコン上では「0」「1」の羅列で表現されています。
例えば、キーボードで「ichi」と打つと、パソコン上では
「01101001011000110110100001101001」
というコンピュータ語(?)に変換されて保存されます。
「人が認識する文字」と、「0」「1」の対応は、世界標準のASCII(アスキー)コードという取り決めで決められています。
たとえば「ichi」だと、
i:01101001
c:01100011
h:01101000
という対応関係があります。
「ichi」のたった4文字を表すのに
「01101001011000110110100001101001」
…長蛇の列ですね。
容量が重たいファイルでは、それだけ多くの「0」「1」が使われている状態になります。
データの送信途中で誤って一箇所が壊れてしまう(0が1となる)と、送信結果が変わってしまいます。
また、データが多いほど、途中でデータが壊れても気づくことが難しいです。
送信側「ichimemo」:0110100101100011011010000110100101101101011001010110110101101111
受信側「ichimmmo」:0110100101100011011010000110100101101101011011010110110101101111
(0が1になっている箇所が1箇所あるため、送信時は「ichimemo」ですが、受信時は「ichimmmo」となってしまいます。
しかも間違っている場所になかなか気づきません。)
このように桁数が長くなるほどデータの確認は確認が大変なので、短く表記しなおした値が欲しいところです。
このようにデータを短く表記しなおした値をハッシュ値といいます。
ハッシュ値は、入力前の値の桁数より短い長さの桁数にランダムに変換されたデータといえます。
ハッシュ値は桁数の長い任意のデータ(入力データ)をハッシュ関数と呼ばれる特殊な計算式に代入することで得られます。
入力:任意のデータ(ichimemo333)
↓
ハッシュ関数
↓
出力:ハッシュ値(ha5646)
(桁数の短いランダムデータに変換される)
ハッシュ値の特徴は?
桁数を減らしてくれるハッシュ値には、以下の3つの特徴があります。
①出力結果から入力データを推測できない
ハッシュ関数はランダムな値が出力されます。そのため、出力結果からもとのデータを逆算することは困難です。
上の例でいうと、「ha5646」の値から「ichimemo333」の値に逆変換することはできません。
ichimemo333 → ハッシュ関数 → ha5646
ですが、「ha5646」を同じハッシュ関数に再入力しても、
ha5646 → ハッシュ関数 → 34wa
のようにもっと桁数が小さくなる値となり、元の「ichimemo333」に復元できません。
②入力データが変わると出力結果も異なる
入力データが一文字異なるだけで、出力結果は全く異なるハッシュ値が算出されます。
上の例でいうと、「ichimemo433」のように一文字異なるだけで、出力結果は「ghpajp」のようにha5646とは全く異なるハッシュ値となります。
ichimemo333 → ハッシュ関数 → ha5646
ichimemo433 → ハッシュ関数 → ghpajp
③同じ入力データを同じハッシュ関数に代入すると、同じハッシュ値が出力される
異なる入力データでは異なる結果となりますが、
同じ入力データをハッシュ関数に代入した場合は、何度でも同じ結果を得られます。
もちろん、入力データは同じでも代入するハッシュ関数が異なると、異なる結果となります。
ハッシュ値の利用例は?何に使うの?
話は戻りますが、ハッシュ値はインターネットでファイルを送受信する際に破損や改ざんチェックとして使われています。
★送信側
ファイルを送るときに、あるハッシュ関数でファイルのデータを基に計算したハッシュ値を一緒に送ります。
送信データ
・ファイルのデータ(ichimemo_filedata.txt)
・ファイルのデータを基にしたハッシュ値aragta352…
(ichimemo_filedata.txt→ハッシュ関数①→aragta352…)
★受信側
送られてきたファイルに対して送信時と同じハッシュ関数を使ってハッシュ値を計算します。
送信側から送られてきたハッシュ値と、受信側で計算したハッシュ値は同じ値になるはずです。
仮に計算結果が異なっていればファイルの破損や改ざんがあったことになります。
受信データ
・ファイルのデータ(ichimemo_filedata.txt)
・ファイルのデータを基にしたハッシュ値aragta352…
受信したファイルのデータに対してハッシュ関数①によりハッシュ値を計算。
ichimemo_filedata.txt→ハッシュ関数①→aragta352…
となれば、受信データのハッシュ値と同じなので破損や改ざんは無し。
ichimemo_filedata.txt→ハッシュ関数①→hapo0042…
のように、受信データのハッシュ値と異なるハッシュ値が計算された場合は、ハッシュ値の特徴②「入力データが変わると出力結果も異なる」のため、送信中になんらかの破損や改ざんがあったと考えられます。
まとめ
いかがでしょうか。
ハッシュ値の特徴をもう一度おさらいです。
②入力データが変わると出力結果も異なる。
③同じ入力データを同じハッシュ関数に代入すると、同じハッシュ値が出力される。
ハッシュ値の特徴をうまく活用することで、計算量を減らしつつ破損や改ざんを確認できるんですね。
他にも、今話題のブロックチェーンやタイムスタンプなんかでもハッシュ値が利用されています。
最近パソコンやスマホを使い続けると目がしょぼしょぼしやすい…
集中してパソコンしていると目が疲れやすくなった…
というときにの原因の一つにアントシアニン不足が考えられます。
アントシアニンを手軽に補うならアサイベリーがおススメです。
アサイベリーにはアントシアニンが多い食材として有名なブルーベリーよりも4.6倍多くのアントシアニンが含まれています。
そのアサイベリーをふんだんに使ったサプリメントの「アサイベリーアイ」。
錠剤タイプのサプリメントなので、手軽にアントシアニンを摂取できます。
初回970円と他のアサイベリー系サプリよりも低価格。
しかも定期販売としては珍しく継続指定回数の制限がありません。
1回だけ試したい!など、気軽に試せるのは嬉しいです。