ファイルを保存するためのSHA-1ハッシュ
-
21-09-2019 - |
質問
読んだあと これ, 、ディレクトリにSHA-1を使用してファイルを保存するのは素晴らしいアイデアのように聞こえます。
しかし、これが何を意味するのかわかりませんが、SHA-1とMD5がハッシュするアルゴリズムであるということです。 SHA-1ハッシュを使用して計算した場合 このルビースクリプト, 、そして、ファイルのコンテンツを変更します(ハッシュが変更されます)、ファイルがどこに保存されているかを知るにはどうすればよいですか?
私の質問は、SHA-1/ファイルストレージシステムを実装することの基本は何ですか?
すべてのファイルが常にコンテンツを変更している場合、それらを保存するためのより良いソリューションはありますか、それともハッシュを更新し続ける必要がありますか?
GoogleDocs、Flickr、YouTube、Dropboxなどの一般的なファイル保存システムを作成する方法について考えています。 PubMed ジャーナル記事または クラムスター 宿題の割り当てとテスト、またはFlickrのような画像だけ)。おそらくAmazon EC2に保存します。ちょうどいくつかのシステムなので、「これはこれから99%のファイルを保存する方法です」と言うことができます。そのため、ファイルを保存して実際の問題に取り組むための堅実な/一貫した方法を構築することを考えるのをやめることができます。
解決
まず第一に、ファイルの内容が変更されている場合、ファイルシステム内のファイルの名前と場所がファイルの内容が変更されたときに変更する必要があるため、Sha-Digestアプローチからのファイル名はあまり適していません。
基本的に、ファイルの内容から最初にSHA-1またはMD5ダイジェスト(=ハッシュ値)を計算します。
たとえば、ダイジェストを持っているとき、 00e4f56c0de1c61fdb926e79e8a0a65bd12930c9
, 、ダイジェストからファイルの場所とファイル名を生成します。たとえば、最初の数文字をダイジェストからディレクトリ構造に分割し、残りの文字をファイル名に分割します。例えば:
00e4f56c0de1c61fdb926e79e8a0a65bd12930c9 => some/path/00/e4/f5/6c0de1c61fdb926e79e8a0a65bd12930c9.txt
これにより、ファイルのSHA-1ダイジェストをデータベースに保存するだけです。その後、常に適切な場所とファイルの名前を見つけることができます。
ディレクトリには、通常、最大数のファイルを含めることができます。たとえば、最大32000のサブディレクトリとディレクトリごとのファイルもあります。この種のハッシュに基づいたディレクトリ構造により、同じディレクトリにファイルが多すぎるとは考えにくいです。また、このようなハッシュを使用して、すべてのディレクトリにほぼ同じ数のファイルがあることを確認してください。すべてのファイルが同じディレクトリにある状況に陥ることはありません。
他のヒント
アイデアはです いいえ ハッシュ値を使用して、ファイルのコンテンツを変更しますが、その名前(およびパス)を変更します。
ハッシュでコンテンツをハッシュで変更することは、通常は可逆ではないため、悲惨です。
使用する動機がわかりません ハッシュ ファイル名(または長い乱数ではなく)ではなく、ハッシュappraochのいくつかの利点があります。
- ディスク上のファイル名は均一です
- ハッシュ値の上部または下部を使用してディレクトリに名前を付けるため、ファイルを比較的均一に配布することができます
- 名前はコードになり、誰かがa)ファイル名を推測することを困難にしますb)写真を分類する(誰かがハードドライブのコンテンツを盗むのか)
- ファイルのコンテンツ自体からファイル名と場所を取得できます(ハッシュがそのようなコンテンツから来ると仮定します。
ハッシュを使用する一般的な関心は、ファイル名とは異なり、ハッシュは無意味であるため、データベースが画像と「参考文献」タイプデータを関連付ける必要があることです(アップローダーの名前、アップロード日、タグなど...)
それについて考える際に、参照されるSO応答を読み直すことで、私はたとえば乱数と比較して、ハッシュの利点はあまりありません...
さらに...一部のハッシュは、通常16進数で表される数値を生成し(参照された質問で見られるように)、これは必要以上に長くファイル名を作成することで無駄に見えるため、より多くのストレスをかけることで、これは無駄に見えると見ることができますファイルシステム(より大きなディレクトリ...)
アイデアは、写真の名前を思いつく必要があるということです。おそらく、多くのディレクトリにファイルを分散させたいと思うでしょう。ユニークな名前を思い付く簡単な方法の1つは、ハッシュを使用することです。
したがって、ハッシュの始まりはマルチレベルのディレクトリ構造のために剥がされ、ハッシュの残りの部分はJPGのファイル名に使用されました。
これには、重複したアップロードを検出するという追加の利点があります。
ハッシュを使用してファイルを保存することで見られる利点の1つは、ファイルデータを1回だけ保存する必要があることを、データベース内で複数回参照できることです。これにより、まったく同じファイルをアップロードしているユーザーが別のユーザーがいる場合、スペースを節約できます。
ただし、これのマイナス面は、ユーザーがアプリからファイルがあると思うものを削除する場合、同じファイルをアップロードした他のユーザーがまだ使用している可能性があるため、ディスクからファイルを物理的に削除することはできません。