構築ユニークな番号のための文字列をjava
-
27-09-2019 - |
質問
私の読み込み書き込み以上10万の文字列ファイルです。にもならないという複製のファイルです。以降の文字列がフラッシュされるファイルと読みません維持します。
できませんので使用のハッシュコードが衝突のハッシュコードによりを忘れた文字列として重複した.二その他の方法で見つけた私のgoogling:
1.使用メッセージダイジェストアルゴリズムのようMD5なうコストがかかりすぎて計算します。
2.使用チェックサムアルゴリズムです。[い場合はこの独自のキー文字列で誰かをご確認ください]
あなたのアプローチちら.感謝。
解決
あなたが示唆し、ハッシュに依存しているとして、あなたが衝突の微視的なリスクとしている大丈夫、あなたはMD5などいくつかのハッシュ関数を使用することができます。
別の方法としては、おそらく、より大きなメモリフットプリントと、A で、すでに遭遇した文字列を格納することです(ツリーの特別なタイプ)トライののの
<時間>アップデート:さらに別の代替は、ブルームフィルタを使用することです。しかし、これはまだハッシュに依存しているが、衝突の任意の小さな確率を持つように調整することができます。
他のヒント
は、メモリに千万の文字列を格納することは、確かにたくさんありますA TreeSet<String>
の最初のが、のここで、のあなたは、あなたがして比較したい千万ユニークな数字キーを保存したいと思いますか?あなたがのユニークと数値の(文字よりもはるかにlittlerベース/基数を持っている)、それを維持したいときは、文字列自体がすでにあるよりも、キーを短くすることができません、あなたは任意のメモリを節約しません。それとも、GZIPなどのデータ圧縮と最高で、これが唯一のオーバーヘッドの多くを追加します。 MD5は、2つの異なる文字列のことができます。の同じハッシュを得ています。
私はあなたがUNIQUE
として列を設定し、前記本当にまともなRDBMS(SQLデータベース)を使用するよりも、このためのよりよい解決策を見ていないし、それに応じて制約違反を処理します。 A RDBMSは、高度なタスクのこの種のために最適化されています。
、そしてあなたは、書き込み/フラッシュの前に、既存のエントリの再読み込みファイルにする必要があります。そうでないかもしれない非常に速く、確かにメモリ効率の良います。
は、その文字列よりも短い文字列の一意のキーを生成する機能を作成する方法はありません。
あなたのタスクを解決することができ、データ構造があります。あなたのデータが十分な大きさであればB-treeが合うかもしれません。ご入力の性質に応じて、より効果的な方法があるかもしれません。
確実重複を除去することはほとんどのファイルのソートと同じくらい困難です。別の答えが示すように、正確にあなたが避けるためにしようとしている正確に何であるように思わメモリの各文字列の完全なコピーを維持することなく、重複を検出する方法が保証されていないされます。
あなたは、ハッシュコードのメモリ内またはディスク上のインデックスを維持し、比較のためのファイルストレージから実際の文字列を取得するためにこれらを使用していますが、これは基本的にデータベースがあなたのために行うことができるだろうか複製う可能性があります。
代替は、それが完全だ後、ファイルを後処理することです。 UNIXのsortコマンドは、大きなファイルではかなり良いです(方法?UNIXのsortコマンドの並べ替え、非常に大きなファイルのは)ので、私は合理的に仕事に標準のUNIXコマンドラインのアプローチを期待することができます:
sort my-file-of-strings.txt | uniq > my-filtered-file-of-strings.txt
(ファイルを重複を削除するuniqのに渡す前に最初にソートする必要があることに注意してください)。
あなたはこれらのツール(または同等物)を持っていない場合は、利用でき、その後、あなたは常にソート自分を外部マージのいくつかの変種を実装しようとすることができます。
の場合は文字列から固定用プールの文字列(N)を利用することができ 最小限の完璧なハッシュ 配列を作成す0...N-1までの番号が付いている。ゼロのスロットを決定のハッシュ関数の文字列は、これまでに見られなかったです。
そうしないと、みを効果的に補正手段以外の 多く メモリ、ソリューションがこれまでは再読み込みファイルを決める前に書きの文字列です。
なにができることの効率的にメモリマッピングの一部のファイルです。
私は本当に最善の解決策だと思うデータベースを使用します。
何らかの理由でデータベースを使用できない場合は、、あなたはまだハッシュコードを使用することができます。確かに、衝突があるでしょう。ちょうどあなたが重複したハッシュコード、あなたのプログラムのチェックファイルを検出したときに、それは本物の重複や衝突であるかどうかを判断するようにいくつかのコードを追加します。