ハッシュ(hash)は、情報系用語として複数の異なる意味を持つ。この記事ではハッシュについてそれぞれの意味を整理するとともに、ハッシュ値に置き換えることをハッシュ化と呼ばないことを提案する。
#ハッシュの主な意味
大きくハッシュ記号とハッシュ法由来に分けられる。また、情報系以外ではハッシュドビーフなど料理でもよく使われている用語である。
- ハッシュ記号
- ハッシュタグ
- ハッシュ法
- ハッシュ関数
- 連想配列の別名
- メッセージダイジェスト
- Git コミットハッシュ
##ハッシュ記号とハッシュタグ
TwitterなどSNSでお馴染みのハッシュタグは、#ではじまる一種のラベルである。#の字形が刃物でみじん切りの痕に似ているからであろうか。英語で#のことをハッシュシンボルと呼ぶ。それ使ったタグラベルなので、ハッシュタグになった。このハッシュタグは、諸説はあるにしろ次節より話題にするハッシュ法をもとにしたものとは直接関係がない。ハッシュシンボル、ハッシュタグ どちらもハッシュと略すことがある。
##ハッシュ法
ハッシュ法とは、コンピュータに保管されているデータを高速にアクセスするための技術である。通常コンピュータにあるデータは、メモリアドレスなどのアドレス番号で管理されている。目的のデータに素早くアクセスができるようにアドレス番号の目次を作ることがある。その目次の仕組みにハッシュ法は広く使われている。アクセスは概ね次の手順で行われる。まずデータをハッシュ関数と呼ばれる変換関数で処理しハッシュ値と呼ばれる値を生成する。このハッシュ値とアドレス番号を組み合わせた目次をハッシュテーブルと呼ぶ。これを使い目的のデータのアドレス番号を入手しアクセスする。
ここで登場したハッシュ法、ハッシュ関数、ハッシュ値、ハッシュテーブル、 全てハッシュと略することがある。
##連想配列の別名
プログラミング言語における連想配列とは配列の添字に文字列を使用することである。一部の言語ではハッシュと呼ばれている。これはPerlなどで連想配列がハッシュ法で実装されていることが由来である。言語によってはコレクション(collection)とも辞書(dictionary)とも呼ばれている。
##メッセージダイジェスト
ハッシュ法で使われているハッシュ関数は同じ値になりにくいものが求められる。 メッセージダイジェストは、この性質を応用しデータの検証を行う。ハッシュ値が異なれば元データが違うことを示せるからだ。ハッシュ値からは元の値を推測することは難しいのでパスワードの保存などに使われている。また、ここで使われるハッシュ関数は暗号学的ハッシュ関数と呼ばれており、ハッシュ法で使われているものに比べてさらに推測しにくい工夫が凝らされている。具体的な暗号学的ハッシュ関数のアルゴリズムにはSHA2がある。かつて多く利用されていたMD5には脆弱性が指摘されており利用機会は減っている。
メッセージダイジェストのハッシュ値の目的が改ざん検出で、ハッシュ法のハッシュ値の目的であるハッシュテーブル利用とは全く異なっている点に注目して欲しい。暗号学的ハッシュ関数と暗号学的ハッシュ関数によるハッシュ値どちらもハッシュと略されることがある。
#Git コミットハッシュ
バージョン管理システムのうち、GitはSubversionと異なり分散型なため更新日時でファイルの更新管理をすることはできない。そこで前節で説明したメッセージダイジェストをファイルの更新管理に利用している。このメッセージダイジェストのハッシュ値のことをコミットハッシュと呼ぶ。これもハッシュと略されることがある。
#ハッシュ化
hashingの訳として使われることがあるようだ。e-words.jp では次のように紹介されている。
ハッシュ化とは、元のデータから一定の計算手順に従ってハッシュ値と呼ばれる規則性のない固定長の値を求め、その値によって元のデータを置き換えること。パスワードの保管などでよく用いられる手法である。
せめてハッシュ値化にできなかったのだろうか。ハッシュにはこれまでに説明したとおり複数の意味がある。この様な用語に単純に化をつけるのは混乱のもとなので避けたほうがよい。ハッシュ化だけでは、全て#に置換されてしまうこともありえる。
#おわりに
ハッシュには、ハッシュ記号由来のものとハッシュ法由来の用語があり、更にハッシュ法由来のものには意味が異なる使い方があることを説明した。特に口頭では省略されやすく勘違いしやすい。無用なトラブルを避けるためにも正確な意味を把握し本来の意味を文脈から推察する必要がある。
#更新
2018/12/10 Gitコミットハッシュの追加。コメント頂いたtenmyo様に感謝します。詳細はコメント欄参照のこと。