なぜ「ハッシュテーブル」または「ハッシュ関数」と呼ばれるのですか?ハッシュはここでは意味がありません[非公開]


26

ハッシュテーブルとハッシュ関数を使用し、聞いて、話し、実装しているのは、現在約4年の開発です。しかし、なぜそれがハッシュと呼ばれるのか、私は本当に理解できませんか?

プログラミングを始めた最初の日を思い出します。この用語は、私にとって面倒な用語でした。その名前基づいて、私はそれが何であるかを決して理解しませんでした。私は実験的に理解し、それが何をするかなぜ、ときに我々はそれを使用する必要があります

しかし、私はそれがなぜhashと呼ばれるのかを理解しようとすることがあります。私はテーブル関数に問題はありません、そして正直に言うと、それらはかなり演de的で合理的な用語です。ただし、keyuniquenessなど、ハッシュの代わりに、より良い単語を使用できると思います。キーテーブルまたは一意性テーブルを使用しないでください。

私の辞書によると、ハッシュは以下を意味します:

  1. ジャガイモと肉の炒め物(非常に無関係)
  2. #記号(別名、番号記号、ポンド記号など)(それでも関連性はなく、単なる命名法です)
  3. 文字列にアルゴリズムを適用します(ハッシュテーブルの最も重要な機能である一意性とはまだ関係ありません)
  4. 食べ物を切る
  5. ハシッシュの別の用語

ハッシュと呼ばれる理由を知っている人はいますか?


32
ハッシュとは少し誤解しているようです。一意性は、明示的にハッシュ関数の機能ではありません(つまり、決して単射ではありません)。
ピーターテイラー

1
@Peter Taylor:ハッシュテーブルは単射マッピングを定義します。
reinierpost

2
@ピーター・テイラー:少しつまらないために、彼らは単射である必要はありませんが、時には全単射でさえあります。整数のハッシュ関数の典型的な実装を考えてください:)
ケプラ

4
ハッシュ、キースペースがハッシュ値スペース(テーブルハッシュの場合)より大きくないか、ハッシュ値スペースが大きすぎて衝突が数学的に実行不可能である(暗号化ハッシュの場合)限り、一意にすることできます。
セキュア

1
また、「キーテーブル」は、「キー/値」データ構造(「辞書」とも呼ばれます)に似ています。すべてのキー/値データ構造がハッシュテーブルではありません。
バルジャック

回答:


46

ウィキペディアによると、ハッシュ関数を指します。さらに一歩進めたい場合、ハッシュ関数のwikiページには、ハッシュ関数での「ハッシュ」という言葉の使用が次のように由来していると書かれています。

「ハッシュ」という用語は、「チョップアンドミックス」という非技術的な意味との類推によって得られます。実際、mod操作などの一般的なハッシュ関数は、入力ドメインを多くのサブドメインに「切り分け」、それらを出力範囲に「混合」して、キー分布の均一性を改善します。


2
「サブドメイン」がそこで何をしているかわからない。ハッシュ関数がそのドメインの値を徹底的に「ミックスアップ」するだけです。
reinierpost

15

フランス語では、ハッシュテーブルは「table de hach​​age」と呼ばれ、関連する動詞「hacher」はチョップ/ミンチすることを意味します(主に食べ物)。動詞to hashは英語でも同じ意味です。

したがって、他の人が指摘しているように、ハッシュと呼ばれます。これは、異なる場所(テーブルエントリ)に分割して入力をカットするためです。


2
実際には、アクセントなしで「hachage」と「hacher」と書かれています。
Ptival

10

番号3は、それと関係のあるすべてのものです。ウィキペディアから:

ハッシュテーブルアルゴリズムの中心にあるのは、単純なアイテムの配列です。これはしばしば単にハッシュテーブルと呼ばれます。ハッシュテーブルアルゴリズムは、データ項目のキーからインデックスを計算し、このインデックスを使用してデータを配列に配置します。この計算の実装はハッシュ関数ですf

index = f(key, arrayLength)

ハッシュ関数indexは、データから配列内を計算しますkeyarrayLength配列のサイズです。以下のために、アセンブリ言語または他の低レベルのプログラム、些細なハッシュ関数は、多くの場合、1つか2つのインラインでインデックスを作成することができますマシン命令を

そのため、ハッシュテーブルは実際にはキーに基づいた値を格納しません。そのキーのハッシュバージョンに基づいて値を保存します。


1
ハッシュテーブルの意味によって異なります。Perl、Java、C#などの言語で提供されるデータ構造は、内部的に参照する種類のハッシュテーブルを使用して、キーから値へのマッピングを提供します。
reinierpost

10

ハッシュコードハッシュコードを使用しているため、ハッシュテーブルはそのように呼ばれ、「カットフード」に関連しています。

このように考えてください-果物のような素敵なオブジェクトを取り、それをハッシュして、他の何かと同じように見えるようにします-数だけ-それ以上の構造はもうありません。その「カットフード」の部分は、あなたの素敵なかわいいオブジェクトを見つけるためにハッシュテーブルで使用されます。

  • あなたのかわいいオブジェクトよりいように見えますか?多分-しかし、それは速くそれを見つけるのに役立ちます-それがポイントです。ああ、それは確かなのはユニークではありません。
     
    ハッシュコードは、同じハッシュコードを持つ他の小さな会社のかわいいオブジェクトが置かれているテーブル内のバケットを見つけます。この小さな会社内では、オブジェクトは等値チェックを使用して検索されます-これはハッシュルックアップよりもはるかに遅いと予想されますが、それらはほんのわずかであるため大したことではありません(他のオブジェクトのほとんどは高速ハッシュのおかげですでに無視されます) 。

3

ハッシュ(小さな断片への切り取り、細断など)は、入力(食品またはスーパーヴィラン)を受け取り、それを比較的均質な出力に変換します。つまり、最初に何があったとしても、最後にはハッシュしかありません。スプーン一杯のハッシュは、入力が何であったかを判断する上で、すべてのハッシュと同じくらい役立ちます(ハッシングマシンのハッシュが適切であると想定)。
そのため、ハッシュは食用または悪のオブジェクトをスプーン1杯のハッシュに減らすことができます。2つの異なるオブジェクトは異なるハッシュを生成し、2つの等しいオブジェクトは等しいハッシュを生成します。つまり、2人のスーパーヴィランがハッシュマシンに落ちた場合、ハッシュを比較して、一方が他方のクローンであるかどうかを判断するだけで十分です。

ある意味では、コンピューターサイエンスのハッシュ関数は少し似ています。さまざまなサイズとセマンティクスの入力全体を取得し、非常に簡単に言えば、それらを断片に切り取り、それらを混ぜ合わせ、結果のシーケンスを断片に戻し、それを混ぜ合わせます。最終的には、ハッシュ化したスプーン1杯(nバイト)の入力があります。


ただし、注意すべき点として、スーパーヴィランは、特定のパラメーターセットを持つスーパーヒーローと同じハッシュを返すこともできます。これは、ハッシュが一意性を決定しないようだからです。ハッシュの衝突があり、すべての...そのあなたが衝突した後に何をすべきか...後に
リグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.