それは本当にあなたの厳しい要件が何であるかに依存します. 「検索にそれほど時間がかからない」などの厳しい要件がある場合は、適用できるソリューションがない可能性があります。単純に多数の検索を高速化することが目的の場合は、単純で短いハッシュで十分です。
一般に、1000 文字の文字列を整数 (1 つの 32 ビットまたは 64 ビットの数値) にハッシュすると衝突が発生する可能性があり、最終的には衝突が発生することは事実ですが、これは心配する必要はありません。
10 文字のハッシュでも衝突が発生します。これは、1000 > 10 という事実の必然的な結果です。10 文字のハッシュごとに、100 個の 1000 文字の文字列1が存在します。
重要な問題は、実際に衝突が見られるかどうか、どのくらいの頻度で衝突が見られるか、そしてそれがまったく問題になるかどうかです。衝突が発生するかどうか (またはどの程度発生する可能性があるか)は、文字列の長さではなく、個別の文字列の数に依存します。
32 ビット ハッシュを使用して 77,100 個の文字列 (4 文字を超える) をハッシュすると、新しいハッシュごとに衝突が発生する可能性が 50% になります。25,000 文字列の場合、可能性はわずか 5 ~ 6% 程度です。1000 文字列では、可能性は約 0.1% です。
「77,100 弦で 50%」と言うとき、これはそうではないことに注意してください。実際に衝突に遭遇する可能性が非常に高いことを意味します。これは、同じハッシュ値を持つ 2 つの文字列が存在する可能性にすぎません。それが大部分の弦に当てはまらない限り、実際に弦を弾く可能性はさらに低くなります。
これは、ほとんどの使用例と同様に、それ以上でもそれ以下でもなく、単に問題ではないことを意味します。数十万の文字列をハッシュしたくない場合は、心配するのをやめて 32 ビット ハッシュを使用してください。
それ以外の場合は、何十億もの文字列をハッシュしたくない場合は、ここで心配するのをやめて 64 ビット ハッシュを使用してください。
つまり、2 つの文字列がある限り、衝突の可能性が完全にゼロになることはないため、どのような場合でも衝突を処理する準備をしておく必要があります。2 つまたは 3 つの 1000 文字の文字列を 500 バイトのハッシュにハッシュするだけでも、原則として衝突が発生する可能性があります (可能性は非常に低いですが可能性はあります)。
つまり、ハッシュの長さ (またはどれだけ良いか悪いか) に関係なく、ハッシュがどちらの場合にも一致する場合は、文字列比較を行う必要があります。
衝突が毎回発生しない場合、それらはまったく無関係です。テーブルに多くの衝突があり、たとえば 10,000 回の検索に 1 回 (これはかなりの割合です!) 衝突が発生したとしても、実際には何の影響もありません。はい、10,000 回のルックアップに 1 回は無駄な文字列比較を行う必要がありますが、残りの 9,999 回は単一の整数のみを比較することで機能します。厳しいリアルタイム要件がない限り、測定可能な影響はまったくゼロです。
5回の検索ごとに完全に失敗して衝突に遭遇したとしても(かなり悲惨なケースです。これは、約8億の文字列ペアが衝突することを意味します。これは、少なくとも16億の文字列でのみ可能です)、これはまだ5 回の検索のうち 4 回は競合にヒットしないため、比較を行わずに不一致の 80% を破棄します。
一方で、10 文字のハッシュを生成するのは面倒で時間がかかり、すぐに存在する 32 ビットまたは 64 ビットのハッシュよりも (設計が悪いため) 衝突が多いハッシュ関数を作成する可能性があります。
暗号ハッシュ関数は確かに優れていますが、非暗号ハッシュ関数よりも実行速度が遅く、16 バイトまたは 32 バイトのハッシュ値を格納するために必要なストレージもはるかに大きくなります (ほとんどの人にとって、事実上何のメリットもありません)。これは空間と時間のトレードオフです。
個人的には、3 行の C コードで実装でき、うまく機能し、非常に高速に動作する djb2 のようなものを使用します。もちろん、使用できるハッシュ関数は他にもたくさんありますが、私はその単純さから djb2 が好きです。
おかしなことに、James Kanze の回答を読んだ後、投稿されたコードは djb2 のバリエーションのように見えますが、シードと乗数が異なるだけです (それぞれ 5381 と 33)。
同じ回答で、文字列の長さを最初に比較することについての発言も良いヒントです。文字列の長さも「ハッシュ関数」の形式と見なすことができることは注目に値します (かなり弱いものですが、「無料で」提供されることがよくあります)。
1ただし、文字列はハッシュのように「ランダムなバイナリ ガベージ」ではありません。それらは構造化された低エントロピー データです。その限りでは、比較は実際には当てはまりません。