「ハッシュ」とは何ですか(そして正確に)?


38

私は「ハッシュ」という言葉が、さまざまな意味を持つさまざまなコンテキスト(すべてコンピューティングの世界の中で)で使用されていることを聞いたことがあります。たとえば、「Pythonを学ぶ」という本の辞書の章では、「Pythonは「dicts」と呼びます。他の言語は「hashes」と呼びます」と言われています。

この単語の他の一般的な使用法は、暗号化に関連しています。私はまた、「ハッシュ」という言葉を高レベルのプログラミング内の特定の機能として使用している人々の声を聞いています(読みました)。

それで、それは正確に何ですか?

(時間と知識のある)誰もが「ハッシュ(またはハッシュ)」の核心を親切に説明できますか?


8
ウィキペディアには、ハッシュテーブル暗号化ハッシュ関数に関する詳細な記事があります。それらにないものを探していますか?
デビッドリチャービー16

1
「ハッシュ」という用語の複数の使用法はすでにリストされていますが、さらに多くの用語があります。それで、あなたは「それは何であるか」という答えをどのくらい正確に期待していますか?
ラファエル

4
この意味での「ハッシュ」とは、「ハッシュテーブル」の短縮です。たとえば、キーの編成にハッシュを使用するテーブルです。ガソリンを「ガス」と呼ぶようなものです。「ガス」がガス状であったり、ガスがガソリンのような性質を持つとは思わないでしょうか?これは言語では常に起こります。特に短縮は、単語の重複の非常に一般的な原因です。
ルアーン

1
「この言葉の定義はありません。ハッシュとは誰にもわかりません。」- 悪魔の辞書
jpmc26

さまざまな一連のハッシュ関数について考えてみましょう:ハッシュ関数はプロパティの束を持つ単なる関数ですが、関連するのは定義された方法ではなく、必要なプロパティです-必要な方法から派生します機能を使用するには-それは関連しています。私たちはそれを使って素早くものにアクセスしたいので、効率的に計算できるようにしたいです。使用可能な無限のスペースがないため、コドメインを有限にする必要があります。衝突をできる限り回避したいので、ハッシュ関数がハッシュを均等に拡散するようにします。
G.バッハ

回答:


44

ハッシュ関数に関するウィキペディアの記事は非常に優れていますが、ここで私の見解を示します。


ハッシュとは何ですか?

「ハッシュ」は、実際にはさまざまな文脈でさまざまな正式な意味を持つ広義の用語です。あなたの質問に対する完璧な答えはありません。一般的な基礎概念を説明し、この用語の最も一般的な用法のいくつかに言及します。

「ハッシュ」とは、 入力オブジェクトとして文字列または数値を出力するハッシュ関数と呼ばれる関数です。入力オブジェクトは、通常、文字列、整数、またはユーザー定義構造のような他のオブジェクトで構成される大きなデータ型のような基本データ型のメンバーです。出力は通常、数値または文字列です。名詞「ハッシュ」はしばしばこの出力を指します。「ハッシュ」という動詞は、しばしば「ハッシュ関数を適用する」という意味です。ハッシュ関数に必要な主なプロパティは次のとおりです。h

  1. 計算が簡単で、
  2. 出力は比較的小さくする必要があります。

例:

0から999,999,999の範囲の数字を0から99の数字にハッシュしたいとします。1つの単純なハッシュ関数はです。h(x)=xmod100

一般的な追加プロパティ:

ユースケースによっては、ハッシュ関数が追加のプロパティを満たすようにしたい場合があります。一般的な追加プロパティを次に示します。

  1. 均一性:オブジェクトのハッシュを明確にしたいことがよくあります。さらに、ハッシュを「広げる」こともできます。一部のオブジェクトを100個のバケットにハッシュする場合(ハッシュ関数の出力は0から99までの数値です)、通常、バケット1に約1/100個のオブジェクトが、バケット1に約1/100個の土地がバケット1など。

  2. 暗号の耐衝突性:時にはこれはさらに先に進みます。たとえば、暗号では、同じ出力にマップされる2つの異なる入力を敵が見つけるのが計算上困難なハッシュ関数が必要な場合があります。

  3. 圧縮:しばしば、任意の大きさの入力を一定サイズの出力または固定数のバケットにハッシュしたい。

  4. 決定論:実行ごとに出力が変化しないハッシュ関数が必要な場合があります。つまり、同じオブジェクトでのハッシュ関数の出力は常に同じままです。これは上記の均一性と矛盾するように思えるかもしれませんが、1つの解決策はハッシュ関数をランダムに1回選択し、実行ごとに変更しないことです。


いくつかのアプリケーション

一般的なアプリケーションの1つは、辞書を実装する方法であるハッシュテーブルなどのデータ構造です。ここでは、100個の「バケット」などのメモリを割り当てます。次に、(キー、値)ペアを辞書に保存するように求められたら、キーを0〜99の数字にハッシュし、メモリ内の対応するバケットにペアを保存します。次に、キーを検索するように求められたら、同じハッシュ関数を使用してキーを0〜99の数字にハッシュし、そのキーがそこにあるかどうかを確認します。その場合、その値を返します。

バイナリ検索ツリーなど、他の方法で辞書を実装することもできることに注意してください(オブジェクトが同等である場合)。

別の実用的なアプリケーションはチェックサムです。これは、2つのファイルが同じであることを確認する方法です(たとえば、ファイルは以前のバージョンから破損していません)。ハッシュ関数が2つの入力を同じ出力にマップすることはほとんどないため、通常は文字列として表される最初のファイルのハッシュを計算して保存します。このハッシュは非常に小さく、おそらく数十個のASCII文字だけです。次に、2番目のファイルを取得したら、それをハッシュし、出力が同じであることを確認します。もしそうなら、ほぼ確実にバイト単位でまったく同じファイルです。

別のアプリケーションは暗号化にあります。これらのハッシュは「反転」するのが難しいはずです。つまり、出力とハッシュ関数が与えられると、その出力につながった入力を計算するのは計算上困難です。これの1つの使用法はパスワードです。パスワード自体を保存する代わりに、パスワードの暗号化ハッシュを保存します(他のいくつかの要素を使用して)。次に、ユーザーがパスワードを入力すると、そのハッシュを計算し、正しいハッシュと一致することを確認します。その場合、パスワードが正しいと言います。(サーバーに保存されたハッシュを調べて見つけることができる人でさえ、ユーザーのふりをするのはそれほど簡単ではありません。)このアプリケーションは、出力が入力と同じかそれより長い場合です。入力が非常に短い。


1
良い説明ですが、私は「非常にありそうもない」ことに同意しません。参照:Programmers.stackexchange.com/questions/49550/…:衝突実際に起こり、時には驚くほど頻繁に起こります。
オリビエデュラック

8
また、暗号化のコンテキストでは、「ハッシュ」という用語は実際には簡単に元に戻せない「一方向」の操作を非常に強く暗示していることに注意してください。簡単に元に戻すことができる場合、「暗号化」と呼ばれます。これが、Security.SEのユーザーが、顧客のパスワードを常にハッシュ化し、暗号化しないように指示する理由です。
Ixrec

4
「広がる」ことのないハッシュは依然としてハッシュであり、おそらくあなたのアプリケーションにとってはあまり良いハッシュではありません。
ハーミングモニカを停止

1
確かに、これらはすべて良い点です。
-usul

10

ハッシュ関数は、入力を受け取り、固定サイズの値を生成する関数です。たとえば、任意の長さstringHashを受け入れstring、32ビット整数を生成するハッシュ関数があります。

典型的には、出力と言うことは正しいハッシュ関数ハッシュ(ハッシュ値やハッシュ和として知らaslo)。ただし、関数自体をハッシュと呼ぶこともあります。これは技術的には正しくありませんが、通常、人がハッシュ関数を意味していると(コンテキストで)理解されているため、通常見過ごされています

ハッシュ関数の典型的な用法はハッシュテーブルを実装することです。ハッシュテーブルは、値を通常キーと呼ばれる他の値に関連付けるデータ構造です。これは、キーでハッシュ関数を使用して、格納されているデータの高速ルックアップに使用できる固定サイズのハッシュ値を生成することによりこれを行います。その方法については詳しく説明しませんが、ここで重要なのは、ハッシュ値(ハッシュ)を生成するためにハッシュ関数に依存しているため、ハッシュテーブルと呼ばれることです。

これが混乱の一部です。何人かの人々(これもやや間違っています)がハッシュテーブルハッシュと呼ぶからです。他の回答で述べたように、時々の特定の言語の実装ハッシュテーブルにはを参照するハッシュテーブルとしてハッシュ(私は他の言語も同様やる期待しても特にPerlは、これを行います)。他の言語は、ハッシュテーブルの実装を辞書として参照することを選択します。Pythonはこれらの言語の1つですが、言語の根底にあるため、多くのPythonユーザーは用語辞書を「dict」に短縮します。

したがって、ハッシュという用語の正しい使用はハッシュ関数によって生成されたハッシュ値を指すことですが、人々は時々、非公式にその用語を使用してハッシュ関数ハッシュテーブルを指すこともあるため、混乱が生じます。


2
ハッシュテーブルまたはハッシュ関数を「ハッシュ」と呼ぶのが本当に間違っているとは思いません(たとえば、「ワシントン」を使用して「米国」を意味するよりも悪くはないようです。ワシントンは中国の声明を慎重に歓迎した」。しかし、私はそれが混乱していることに同意し、あなたがあなたの答えでそれについて非常に明確であることは良いことです。
デビッドリチャービー

1
@DavidRicherby正式には、「ハッシュ」という仕事は未定義だと思います。「ハッシュ関数」、「ハッシュ値」、「ハッシュテーブル」、および「文字列をハッシュする」にはすべて正確な数学的な定義がありますが、「ハッシュ」はあいまいです。同様に、「ワシントン」の意味は知っていますが、「ワシントンの街」ではなく「ジョージワシントン」または「デンゼルワシントン」を意味するように「ワシントン」を解釈すれば、あなたの文章は依然として意味があります。連邦政府を参照します。結論:厳密な正式な定義と「意味を知る」を混同しないように注意してください。
マイクOunsworth 16

@DavidRicherbyそれは実際には同等のアナロジーではありません。不正確さは議論の余地がありますが、非公式性はそうではありません。
ファラプ

2

ハッシュ関数は、画像がドメインよりも小さいあらゆる関数です。このような関数の出力はf(x)、「のハッシュ」と呼ばれxます。

コンピュータサイエンスでは、通常、ハッシュ関数の2つのアプリケーションに遭遇します。

1つ目は、ハッシュテーブルなどのデータ構造用で、キードメイン(32ビット整数や任意の長さの文字列など)を配列インデックス(0〜100の整数など)にマッピングします。ここでの目標は、データ構造のパフォーマンスを最大化することです。通常望ましいハッシュ関数の特性は、単純さと均一な出力分布です。

Perlは、組み込み連想配列型を「ハッシュ」と呼びます。これは、ここで混乱を引き起こしているように見えます。これを行う他の言語は知りません。大まかに言って、データ構造はハッシュ関数自体(ドメインは現在のキーのセット)として見ることができますが、ハッシュテーブルとしても実装されています。

2番目は暗号化用です。メッセージ認証、パスワード/署名の検証などです。ドメインは通常、任意のバイト文字列です。ここで私たちはセキュリティに関心があります-時には意図的に低いパフォーマンスを意味します-有用なプロパティは衝突とプリイメージ耐性です。


また、SHA-512で32文字のパスワードをハッシュする場合、入力スペースは実際には出力スペースよりも小さいため、最初の文にはまだ異議があります。ハッシュ関数を連鎖させる場合、ドメインと範囲は同じです。入力スペースのサイズは無関係です。Pharapの答えには正しい定義があります。「ハッシュ関数は、固定長の出力を持つ関数です」。それだけです、それがあなたが必要とするすべてです、あなたが話している他のすべての条件はそれから暗示されます。
マイクOunsworth 16

@MikeOunsworthただし、SHA-512のドメインは任意の長さのバイナリ文字列です。ファラプスの言葉遣いを盗むことができると思いますが、OPの利益のために条件を明確にしようとしていました。「固定長の」が必要であるか、明確に定義されているかは実際にはわかりません。
停止ハーミングモニカ

@OrangeDogわかりましたがMikesHash()、長さ12の文字列を受け取り、SHA-512に渡し、出力を返すという関数内にSHA-512をラップできます。私はMikesHash()まだハッシュ関数の定義を満たしていると確信しています。(実際、私たちが使用するハッシュ関数は任意の長さの入力を受け入れますが、ハッシュ関数がそうでなければ失敗することはないと思います。)
マイクオウンスワース

@MikeOunsworth同様に、msbが1の場合、出力が切り捨てられるか、パディングされるようにラップできます。出力はもはや固定長ではありませんが、それでもハッシュ関数ですか?
停止ハーミングモニカ

@OrangeDog私はノーと言うでしょう。私のポイントはすべて、ハッシュ関数は固定サイズの出力にマッピングする必要があるが、入力サイズは無関係であるということです。私たちは非常に話題から外れました。あなたの答えには良いものがありますが、あなたの正式な定義に注意してください;-)
マイクオウンスワース

0

素晴らしい質問バジル・アジス、

これが、私が今日取り組んでいるものに対するハッシュとは何かという私の見解です。

*

チェックサムを使用して、tarballがダウンロードページと一致していることを確認します

*

ここに画像の説明を入力してください 審査員の帽子をかぶる

ハッシュは値/文字列/なんでも/ラベルであり、あなたのマシン上でダウンロードのソースと同じであることを確認してください。


3
これはハッシュの唯一の使用法です。他にも多くの用途があります。
ユヴァルフィルマス

サイトへようこそ!チェックサムとしての暗号化ハッシュの使用は、受け入れられた回答で既にカバーされているため、多くの画面スペースを占有しながら、あなたの回答は新しいものを追加しません。
デビッドリチャービー

-1

他の人が言っていることの短い要約を追加しようとします。

ハッシュ関数

ハッシュ関数と呼ばれる特別な種類の関数があります。

「SHA256は暗号的に安全な有名なハッシュ関数です」

主な3つのアプリケーションは、*ハッシュテーブル、*チェックサム(ハードドライブやADSLプロトコルなどのデータ整合性チェック)、*および暗号化(デジタル署名や安全なパスワードストレージを含むがこれらに限定されない暗号認証のさまざまな形式)です。

ハッシュ表

ハッシュテーブルは、高速検索のためのデータ構造です。内部的にハッシュ関数を使用しているため、名前が付けられています。

「データベースは内部的にハッシュテーブルと検索ツリーを使用して、検索リクエストの実行を高速化します」

ハッシュ

  1. 辞書の抽象データ型

「ハッシュ」は、Perlの組み込み辞書の公式名です。内部的にはハッシュテーブルであるため、名前です。「このサブルーチンは、最初の引数としてハッシュを受け入れます」。これらの日は、ハッシュテーブルである必要はなく、任意の連想配列に使用できます。

  1. ハッシュ関数を何らかの入力に適用した結果

「.isoイメージのMD5ハッシュは、ダウンロード後に整合性を確認するために提供されます」。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.