Perl でハッシュを宣言し、後で特定の順序でいくつかのキーと値のペアを追加しました。ハッシュを反復すると、キーと値のペアが格納された順序と同じになりません。理由は何ですか?
3 に答える
ハッシュは、ハッシュ関数によって管理される順序でデータを保持するためです。また、優れたハッシュ関数は、キーをほとんどランダムに見えるハッシュ値にマップします。
Perl で順序付きハッシュが必要な場合は、Tie::Hash::Indexed
またはを使用できますTie::IxHash
。
一般に、ハッシュマップはどの言語でも順序を保持しません。
キーを反復処理して並べ替え順序を取得する前にキーを並べ替えることができます。元の挿入順序が本当に必要な場合は、それを別の配列に個別に保存できます。
ハッシュが順序を保持しない理由は、ハッシュ テーブルと呼ばれる特別な構造に格納されているためです。
にアクセスする$hash{key}
と、内部key
では、その値の場所を識別するインデックスに変換されます。これにより、ハッシュに膨大な数の要素がある場合でも、ハッシュの内容にほぼ瞬時にアクセスできます。
対照的に、ハッシュが挿入順序を保持する構造 (従来の配列など) に格納されている場合、特定の要素を見つけるために多数のルックアップが必要になります。100 万個の要素の配列がある場合、特定の要素を見つけるには、平均で 500,000 回の操作が必要になります。
データにアクセスするために必要な主な方法が挿入の順序である場合は、代わりに従来の配列を使用することをお勧めします。