2

私は「ファイル共有ホスティング」を書いています。アップロード時にすべてのファイルの名前を一意の名前に変更し、データベース上の名前を何らかの方法で追跡したいと考えています。2つ以上のファイルに同じ名前を付けたくないので(これは確かに不可能です)、キーまたは何かに基づいてランダムな名前を生成するアルゴリズムを探しています。

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

そのようなアプリケーションを作成する方法はありますか?

4

5 に答える 5

11

ファイルの内容自体に基づいてハッシュを生成できます。これには 2 つの正当な理由があります。

  1. 同じファイルを 2 回保存することはありません。たとえば、内容が同じ音楽ファイルのコピーが 2 つある場合、そのファイルが既に保存されているかどうかを確認し、1 回だけ保存することができます。

  2. ブロブからメタデータ (ファイル名は単なるメタデータ) を分離します。したがって、ファイル コンテンツのハッシュによってインデックス付けされたストレージ システムがあり、ファイルのメタデータをそのハッシュ ルックアップ コードに関連付けます。

ハッシュのサイズによっては、実際には同じ内容ではない同じハッシュを計算する 2 つのファイルを見つけるリスクは低く、おそらくファイルをチャンクでハッシュすることで効果的に軽減できます (これにより、いくつかの興味深いストレージ最適化シナリオ:P)。

于 2009-03-31T02:56:06.487 に答える
4

GUIDは一方向です。基本的に、繰り返しが発生しないことが保証されています(適切なランダムジェネレーターがある場合)。

于 2009-03-31T02:37:32.723 に答える
3

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

于 2009-03-31T02:40:21.250 に答える
3

最善の解決策はすでに述べられています。いくつかの考えを追加したいだけです。

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

より良い解決策は、このシナリオで GUID を使用することであり、プロセス間の同期を気にする必要はありません。

最後に、すべての識別子にランダムなデータを使用して、これが要件であるかどうかを推測しにくくすることができます。

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

于 2009-03-31T02:57:24.767 に答える
1

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

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

file = last_file + random(1 through 10)
于 2009-03-31T02:38:44.217 に答える