2009-03-31 21 views
2

私は「ファイル共有ホスティング」を書いています。ユニークな名前にアップロードするときにすべてのファイルの名前を変更し、データベース上の名前を何とか追跡したいと思います。 2つ以上のファイルが同じ名前(確かに不可能です)を必要としないので、私は鍵などに基づいて私のためにランダムな名前を生成するアルゴリズムを探しています。衝突なしで自動的にファイル名を生成

さらに、名前を生成してデータベースを検索して、ファイルが既に存在するかどうかを確認したくありません。私は100%または99%の生成されたファイル名が私のアプリケーションによって以前に作成されたことがないことを確認したい。

どのように私はそのようなアプリケーションを書くことができますか?

答えて

10

ファイルの内容自体に基づいてハッシュを生成することができます。 - 例えば、あなたはコンテンツが同じである音楽ファイルの2つのコピーを持っている場合は、あなたかどうかを確認することができ

  1. はあなたが二度同じファイルを保存することはありませんすることができます。これを行うには、2つの理由があります。そのファイルを既に保存しておき、一度だけ保存してください。

  2. blobからメタデータ(ファイル名はメタデータのみ)を分離します。したがって、ファイル内容のハッシュによって索引付けされたストレージシステムがあり、ファイルメタデータとそのハッシュ検索コードを関連付けることになります。

  3. ハッシュの大きさに応じて、実際に同一の内容ではありません同じハッシュを計算する2つのファイルを、見つけることのリスクは低いだろう

、あなたが効果的に多分にあるファイルをハッシュすることによってそれを軽減することができますチャンク(興味深いストレージ最適化シナリオにつながる可能性があります:P)。

+0

このようなことをするなら、次の記事を必ず読んでください:http://www.linuxworld.com/cgi-bin/mailto/x_linux.cgi?pagetosend=/export /home/httpd/linuxworld/news/2007/111207-hash.html –

+0

ソース管理システムがこのマンガーのリンケージを検出しない理由はありますか? – ojblass

+0

いくつかあります。 Gitはハッシュ後に内部リポジトリ内のすべてのファイルの名前を付けます。 –

3

GUIDsは片道です。あなたは基本的に何らかのリピートを取得しないことが保証されています(適切なランダムジェネレータがある場合)。

1

最も良い方法は、単純にカウンタを使用することです。最初のファイルは1、次のファイルは2、別のファイルは3など...

しかし、あなたはランダムにしたいようです。これをすばやく行うには、乱数がより大きく、の最後のファイルよりも大きいであることを確認することができます。最後のファイルをキャッシュし、その乱数を姓でオフセットすることができます。

file = last_file + random(1 through 10) 
+0

+1しかし、私はあなたが "ランダム(1から10)"を望んでいると思う - あなたが0を持っているなら、あなたは前回と同じIDを割り当てるでしょう。 –

+0

はい、あなたは正しいです。私はあなたの提案を編集しました。 – carl

2

エポックからの時間を追加することもできます。

3

最良の解決策はすでに述べられています。私はちょうどいくつかの考えを追加したい。

最も簡単な解決策は、新しいファイルごとにカウンタとインクリメントを設定することです。これは、1つのスレッドだけが新しいファイルを作成する限り、非常にうまく動作します。複数のスレッド、プロセス、さらにはシステムによって新しいファイルが追加されると、状況は少し複雑になります。新しいIDの作成をロックまたはそれに類する同期方法で調整する必要があります。また、すべてのプロセスにID範囲を割り当てて、同期作業を減らしたり、一意のプロセスIDでファイルIDを拡張することもできます。

このシナリオでGUIDを使用する方がよい場合があり、プロセス間の同期に注意する必要はありません。

最後に、これが要件であるかどうかを推測することをより困難にするために、すべての識別子にいくつかのランダムなデータを付けることができます。

また、coommonは、ファイルの場所がその名前に依存するディレクトリ構造にファイルを格納しています。ファイルabcdef1234.xyzは/ab/cd/ef/1234.xyzとして格納されます。これにより、膨大な数のファイルを持つディレクトリは避けられます。私は実際にこれがなぜ行われたのか分かりません - ファイルシステムの制限、パフォーマンスの問題などありますが、それはかなり一般的です。ファイルがデータベースに直接格納されている場合も同様のことが一般的であるかどうかはわかりません。

関連する問題