短いバージョン: ハッシュテーブルは、データのハッシュ コードだけでは機能しません。実際のデータが含まれている必要があります。ハッシュ テーブルに指定するのがハッシュだけの場合、それは dataです。作成しようとしているハッシュのハッシュテーブルは、サイズ変更に問題はありません。ハッシュテーブルに関する限り、挿入したハッシュはデータであり、データを生成するためにハッシュされたものは何でもかまいません。
長いバージョン:
ハッシュテーブルとハッシュのテーブルは、直交する 2 つのアイデアです。どちらのコンテキストでもあまり意味をなさない方法で 2 つを混同しているように聞こえます。
ハッシュテーブルの場合、要点は、キーを明確に値にマップすることです。両方がなければテーブルは役に立たない。ハッシュテーブルが使用するハッシュ コードは、データから論理的に分離されていません。ハッシュ コードの唯一の目的は、実際のキー -> 値のマッピングをすばやく見つける (または保存する) ことです。マッピングするには、実際のキーと実際の値が必要です。
実際のキーが必要な大きな理由は、ハッシュ コードが限界に達しているからです。ある程度、すべての有用なハッシュテーブルとすべてのハッシュ関数は、本質的にピジョンホールの原則に拘束されています。これの意味は
- 定義上、すべてのハッシュ関数は、2 つの異なる値に対して等しいハッシュ コードを返すことができます。と
- すべての有用なハッシュテーブルは、何らかの方法で衝突を解決する必要があります (等しいハッシュ コード間および/または同じバケットを指す異なるハッシュ コード間)。
ハッシュテーブルは、実際にはピジョンホールの原則によって二重に影響を受けます。データを (通常は int サイズの) ハッシュ コードに縮小する必要があるだけでなく、ほとんどのハッシュ テーブルは合理的に 40 億のバケットを持つことができないため、コードはそのハッシュ コードをさらに縮小して、バケット番号。(一般的な例は、ハッシュコードに素数をかけ、バケットの数をmodすることです。)
読み取り専用のハッシュテーブルでさえ、通常は衝突を解決する必要があります。テーブル内のすべての値が最終的に独自のバケットになるほど完璧なハッシュ関数を使用する読み取り専用のハッシュ テーブルを想像してみてください。この場合でも、テーブルにないキーを見つけようとして、テーブルにあるキーを含むバケットに解決されるハッシュ コードを生成するとどうなるでしょうか? 再確認するために値自体が必要であるか、ハッシュコードが実際には等しくなくても、テーブルが嘘をついてキーが存在すると言っています!
基本的に、テーブルはルックアップ キーのハッシュ コード (または、より一般的には、そのハッシュ コードに対する何らかの関数からの戻り値) を使用して、検索するバケットを特定し、そのバケット内の各実際のキーを実際のルックアップと比較します。曖昧さをなくすためのキー。これは、次の場合を除き、何らかの実際のキーがないと機能しません。
- ハッシュ関数は、すべての入力に対して一意の値を生成することが保証されていました (ハッシュ関数ではなく、エンコードまたは暗号化関数になります)。
- 無限の数のバケットがありました。
元のデータなしでハッシュ テーブルにハッシュを含めることができる唯一の方法は、ハッシュがデータである場合です。 その場合、ハッシュのハッシュテーブルがあります。あなたが言及している場合、パスワードの SHA /mcrypt/bcrypt/whatever ハッシュにマッピングして、ユーザー名のハッシュをキーとして使用できます。その場合、ハッシュがキーであり、ユーザー名はもう気にしません。ハッシュテーブルが使用するハッシュ関数は、使用したハッシュ関数とはほとんど関係がないため、これによりサイズ変更などの問題が発生することはありません。ハッシュテーブルが気にする限り、あなたが与えたハッシュは単なる別の値であり、独自のハッシュコードを持ち、そのハッシュコードはハッシュテーブルが内部で何かを見つけるために使用するものです.
ただし、ユーザー名にハッシュを使用しないように警告する場合があります。認証データの少なくとも 1 つの部分は衝突防止であり、ハッシュは本質的に衝突防止ではないことをお勧めします。また、ハッシュ化されていないパスワードをユーザーが目にする可能性のある場所に保存しているあなたを見つけたら、あなたのプログラミング ライセンスを個人的に破棄します。:) おそらく、暗号化した場合ハッシュする代わりにユーザー名?これにより、一意性が効果的に保証され、公開鍵暗号化を使用して秘密鍵を「忘れた」場合、事実上、ハッシュと同じくらい元に戻すことができなくなります。気の利いた副作用は、公開鍵暗号化がその仕組みのために一般的にちょっと遅いことです。基本的に、1024 ビット以上の数値を取得し、それ自体を何千回も乗算します。そのため、ブルート フォースに対する保護が組み込まれています。