ハッシュ関数の面白さ

ブロックチェーンの仕組みを調べていると「ハッシュ」という言葉が頻繁に出てきます。
公開鍵をハッシュすることでアドレスを生成する
とか、
前のブロックのハッシュ値を現ブロックのヘッダに含めることで、ブロックの改ざんを困難にする
とか。
この記事では、ハッシュとはどういうものなのか、その性質の面白さについて解説します。

用語の整理

「ハッシュする」とか、「ハッシュ値」とか、単に「ハッシュ」とか、言葉の使い方に揺れがありますので、少し整理します。

ここでは、何らかの与えられたデータをハッシュ関数に入力し、得られた値をハッシュ値とします。一般に「ハッシュする」とは、「ハッシュ関数を適用する」という意味合いで使われることが多いように思います。単に「ハッシュ」と呼ぶときは微妙です。ハッシュ関数を表す場合もあるし、ハッシュ値を表す場合もあります。

ハッシュ関数

ハッシュ関数は、ダイジェスト(要約)関数とか、一方向関数とか呼ばれることがあります。どちらも、なかなかうまい表現です。ハッシュ関数の特徴は、次の3点です。

  1. どんなサイズのデータを入力しても、一定の長さのデータが出力される。
  2. 入力データをほんの少し変更すると、出力データはとても変わる。
  3. 総当たり以外の方法で、出力データから、入力データを計算できない。

試してみよう

こういうのは触って見るのが一番。というわけで、用意しました。


入力データ:に適当な文字を入力すると、入力ごとに自動でハッシュ関数を適用します。ハッシュ値:のテキストボックスには、入力データのハッシュ値がリアルタイムで表示されます。
 先に挙げた特徴を、それぞれ試してみましょう。

どんなサイズのデータを入力しても、一定の長さのデータが出力される。

入力データに1文字を入れると、64文字のハッシュ値が出力されます。もう1文字入れると、別の64文字のハッシュ値が得られます。ためしに、このページの文章をコピーして、入力データに貼り付けてみてください。それでも、同じ長さの64文字のハッシュ値があらわれます。このようにハッシュ関数は入力データの大きさにかかわらず、固定長の値を出力します。

ハッシュ関数はそのアルゴリズムによって複数の種類があります。

ちなみに、ここではSHA256というアルゴリズムを用いて、ハッシュ値を計算、出力しています。SHA256は常に256bitのハッシュ値を出力します。ここではハッシュ値を16進数で表記しているので、1文字4bit x 64=256bitとなります。

ハッシュ関数が要約関数ともよばれる理由はここにあります。大きなデータでもハッシュ関数を適用すると、データの意味や特徴をを読み取って要約するわけではないですが、コンパクトなデータとして出力されます。かつ、入力データが変わると、ハッシュ値も変わるため、要約という表現が用いられているのかもしれません。

入力データをほんの少し変更すると、出力データはとても変わる。

入力データを入れたり消したりしていると何となく気づくと思いますが、ハッシュ関数は、入力データをほんの少し変更するだけで、ハッシュ値がとても変化します。これは次の特徴と関連します。

総当たり以外の方法で、出力データから、入力データを計算できない。

ハッシュ値から元の入力データが全くわからないということです。これが、ハッシュ関数が一方向関数と呼ばれる所以です。

何に使われるのか

ビットコインでは、秘密鍵生成、ビットコインアドレス生成など、さまざまな場面でハッシュ関数が用いられています。なかでも、ブロックチェーンにおいて一つ前のブロックのハッシュ値を、自分のブロックのヘッダに含めるというのが、最も重要な使われ方ではないでしょうか。

ビットコインやブロックチェーン以外の分野では、巨大ファイルのエラーや改ざん検出のために、ハッシュ関数が用いられています。OSなどのGBクラスのファイルをダウンロードすると、比較的無視できない確率でデータの誤りが発生することがあります。そこで、あらかじめ配信側でファイル本体に並べて、そのファイルのハッシュ値を表示しておきます。ファイルをダウンロードする側は、ダウンロードしたファイルのハッシュ値を求め、配信側のハッシュ値と比較します。ハッシュ値が一致して入れば、ファイルダウンロードが成功したことがわかります。

 

ハッシュ関数の面白さ」への2件のフィードバック

コメントは停止中です。