0

C文字列のすべての順列が同じハッシュキーを持つハッシュ手法を実装したいと思います。
たとえば、 abccab両方が同じキーを持つ必要があります。

私は値を追加してasciiからチェックすることを考えました[frequency of charactersそうでなければ両方が重要であり、私たちが望まない同じキーを持っているでしょう]。 しかし、それはあまり効率的ではないようです。 abcaad

衝突をうまく解決し、まばらなハッシュテーブルにならないより良いハッシュ関数はありますか?

for strings衝突を最小限に抑えるだけでなく、操作[ insertion ,deletion, search]も十分に高速なJava []によって内部的に使用されているハッシュ手法はどれですか?

4

4 に答える 4

12

ハッシュする前に文字列の文字を並べ替えてみませんか?

于 2012-06-24T14:35:38.070 に答える
4

明らかな手法は、単純に文字列をソートすることです。ソートされた文字列を検索キーとして単純に使用することも、適切と思われる任意のアルゴリズムでハッシュすることもできます。または、文字列のランレングス エンコード (RLE) 表現を使用し (RLE は にbananaなりますa3bn2)、オプションでそれをハッシュすることもできます。

ハッシュで何をしようとしているのか、およびハッシュが衝突に対してどれだけ耐性がなければならないかによって、多くのことが異なります。単純な CRC (巡回冗長チェックサム) で十分な場合もあれば、MD5 や SHA1 などの暗号化チェックサムが十分に安全でない場合もあります。

于 2012-06-24T14:41:48.427 に答える
2

衝突を最小限に抑えるだけでなく、操作[挿入、削除、検索]も十分に高速なJava [文字列用]によって内部的に使用されるハッシュ手法はどれですか?

速度のために Java で使用される基本的な「トリック」は、ハッシュ値をキャッシュして a のメンバー変数にするStringことであり、一度だけ計算します。ただし、文字列は不変であるため、これは Java でのみ機能します。

于 2012-06-24T14:40:18.097 に答える
1

ハッシュに関する主なルールは、「独自のハッシュ アルゴリズムを発明しないでください。決して」です。文字列内の文字を並べ替えて、標準のハッシュ戦略を適用するだけです。

ハッシュに興味がある場合は、それもお読みください。

于 2012-06-24T14:49:00.137 に答える