回答:
Hash
は、プログラマーが実装とインターフェイスを混同している非常に貧弱な名前のデータ構造です(フルネームを書くのがHashTable
面倒Hash
でした。つまり、代わりに略語に頼っていました)。
Dictionary
インターフェースの「正しい」名前(= ADT)、つまり(通常は一意の)キーを(必ずしも一意ではない)値にマッピングする連想コンテナです。
ハッシュテーブルは、このようなディクショナリの可能な実装の1つであり、非常に優れたアクセス特性(ランタイムの観点)を提供するため、多くの場合デフォルトの実装です。
このような実装には、2つの重要なプロパティがあります。
(キーがハッシュ可能であるということは、キーから数値を計算できることを意味します。このキーは、後で配列のインデックスとして使用されます。)
キーに順序付けを行うディクショナリデータ構造の代替実装が存在します。これは、ソート済みディクショナリと呼ばれます(通常、検索ツリーの観点から実装されますが、他の効率的な実装も存在します)。
要約すると、辞書は、キーを値にマップするADTです。このADTにはいくつかの可能な実装があり、そのうちハッシュテーブルは1つです。Hash
は誤った呼び方ですが、コンテキストでは、ハッシュテーブルの観点から実装された辞書と同等です。
Hash
、Ruby 1.9 Hash
esは挿入順序を保持するがハッシュテーブルは保持しないため、クラスをハッシュテーブルで実装することは実際には不可能です。そのため、Ruby 1.9では、名前Hash
は実装を反映していません。
「辞書」は概念の名前です。ハッシュテーブルは可能な実装です。
辞書は、直接内部の値を参照するためにキーを使用して連想配列。
すなわち (KEY => VALUE)
ハッシュは、より頻繁にと記載されているハッシュテーブル使用するハッシュ関数値となり、メモリ内の位置(又はより簡単アレイ)を算出します。ハッシュはキーを入力として受け取り、出力として値を提供します。次に、その値をメモリまたは配列インデックスに接続します。
すなわち KEY => HASH FUNCTION => VALUE
1つは直接的なもので、もう1つはそうではないようです。ハッシュ関数も完全ではない場合があり、間違った値を参照するインデックスを提供する場合があります。しかし、それは修正することができます。
見るのに最適な場所:ウィキペディア(連想配列とハッシュテーブル)
unordered_map
何であるかではなく、彼らが何をするかを示すために呼ばれています。