1

ハッシュ関数と言うとき、ほとんどの記事でキーのシーケンス バイトを 32 ビットまたは 64 ビットの符号なし整数に変換することを意味することがわかりました。たとえば、これを参照してください。

しかし、hash_table を実装すると、そのハッシュ関数は非常に大きな整数をより小さな内部配列インデックスに変換することを意味するように見え、このドメインでは、上記の「ハッシュ関数」の意味がキーのハッシュ値に変更されます。

  1. 私の理解は正しいですか?
  2. 大きな整数を小さな内部配列インデックスに変換することに関する洞察、リンク、または論文を誰かが提供できますか?

ありがとう

4

3 に答える 3

1

「ハッシュ」という用語は、通常、上記の両方の意味をカバーします。他の回答が指摘しているように、操作は似ています。また、通常、この 2 つのプロセスは連携して使用されます。一方は他方なしでは役に立ちません。

ハッシュシステムを探したり設計したりするとき、厄介な部分は、適切に分散された 32/64 ビット整数 (実際の「ハッシュ関数」) を生成することです。適切な初期ハッシュ値を取得したら、結果が最終的なインデックス全体にかなり均等に分散されている限り、その出力を正確に使用する方法は重要ではありません。(この種の機能分割により、ハッシュ関数とは独立してアルゴリズム/データ構造を更新できます。)

最終的なインデックス (固定サイズのハッシュ テーブルに適しています) を生成する明白な方法は、インデックスの数を法としてハッシュ値を取得することです。ただし、ハッシュ値の使用方法はアプリケーションによって異なります (たとえば、動的サイズのハッシュ テーブルは、固定サイズのテーブルとは異なる処理を行う可能性があります)。

于 2012-01-06T18:09:00.603 に答える
1

「ハッシュ関数」についての私の理解は次のとおりです。セット A からセット {0, 1, 2, ..., n} までの任意の関数 (n は非負の自然数)。「ハッシュ関数」であることの本質的な部分は他にありません。あなたの例と他の多くの例は両方とも、物事を非負の整数のサブセットにマップするため、「ハッシュ関数」で構成されています。「ハッシュ関数」が問題に適用される方法も、定義の一部ではありません。

ドメインがコドメインよりも大きくなければならないとは思いませんが、間違っているかもしれません。コドメインが無限になるとは思いませんが、間違っているかもしれません。

于 2012-01-06T17:48:14.430 に答える
0

ハッシュ関数は、大きなデータ セットから小さなデータ セットへの単純なマッピングです。ハッシュ テーブルの場合、その小さなデータ セット (ご指摘のとおり、多くの場合整数) がバケットのルックアップ キーとして使用されます。

記事の例によると、これらすべてのハッシュ関数が出力するすべての整数は、ハッシュ テーブルのルックアップ インデックスとして使用されます。

于 2012-01-06T17:46:09.267 に答える