入力文字列でハッシュ関数を使用します。出力ハッシュは、レコードの主キー/IDになります。
次に、DBに次のハッシュ/ID/主キーがあるかどうかを確認できます。
- そうでない場合:これは新しい文字列です。文字列とハッシュをidとして含む新しいレコードを追加します。
- 含まれている場合:ロードされたレコードの文字列が入力文字列と同じであることを確認します。
- 文字列が同じ場合:重複しています
- 文字列が異なる場合:これは衝突です。衝突解決スキームを使用して解決します。(以下のいくつかの例)
速度と予想される文字列の数、およびハッシュ衝突の要件/保証に基づいて、使用するハッシュ関数/スキーム/強度を検討する必要があります。
衝突を解決するいくつかの方法:
- 2番目のハッシュ関数を使用して、同じテーブルに新しいハッシュを作成します。
- レコードにマークを付け(たとえばNULLを使用)、2番目の「衝突」テーブルでより強力な2番目のハッシュ関数(より広いドメインを使用)で繰り返します。クエリで、文字列が衝突としてマークされている場合(たとえば、NULL)、衝突テーブルで再度ルックアップを実行します。また、動的完全ハッシュを使用して、この2番目のテーブルにそれ以上の衝突が発生しないようにすることもできます。
もちろん、これがどれだけ永続的である必要があるか、および使用すると予想されるメモリの量/文字列の数に応じて、データベースなしで、メモリ内で直接これを行うことができます。これははるかに高速です。