Frage

Nach dem Lesen Dies, Es klingt nach einer großartigen Idee, Dateien mit dem SHA-1 für das Verzeichnis zu speichern.

Ich habe keine Ahnung, was dies bedeutet, aber ich weiß nur, dass SHA-1 und MD5 Hashing-Algorithmen sind. Wenn ich den SHA-1-Hash berechne Dieses Ruby -Skript, und ich ändere den Inhalt der Datei (was den Hash ändert). Woher weiß ich, wo die Datei dann gespeichert ist?

Meine Frage ist dann, was sind die Grundlagen bei der Implementierung eines SHA-1/Datei-Storage-Systems?

Wenn alle Dateien ständig den Inhalt ändern, gibt es eine bessere Lösung für das Speichern oder müssen Sie nur den Hash weiter aktualisieren?

Ich denke nur darüber nach, wie man ein generisches Dateispeichersystem wie Googleledocs, Flickr, YouTube, Dropbox usw. erstellt, etwas, das Sie in verschiedenen Umgebungen wiederverwenden können (z. B. Speichern PubMed Zeitschriftenartikel oder Cramster Hausaufgaben und Tests oder nur Bilder wie auf Flickr). Ich würde sie wahrscheinlich bei Amazon EC2 aufbewahren. Nur ein System, damit ich sagen kann: "So werde ich in 99% der Zeit von nun an Dateispeichern einlagern.

War es hilfreich?

Lösung

Wenn sich der Inhalt der Dateien ändert, ist der Dateiname vom Sha-Digest-Ansatz zunächst nicht sehr geeignet, da sich der Name und der Speicherort der Datei in Dateisystem ändern müssen, wenn sich der Inhalt der Datei ändert.


Grundsätzlich berechnen Sie zuerst einen SHA-1- oder MD5-Digest (= Hash-Wert) aus dem Inhalt der Datei.

Wenn Sie zum Beispiel eine Verdauung haben, 00e4f56c0de1c61fdb926e79e8a0a65bd12930c9, Sie generieren einen Dateispeicherort und einen Dateinamen aus der Digest. Sie haben beispielsweise die ersten paar Zeichen vom Digest in die Verzeichnisstruktur und den Rest der Zeichen in den Dateinamen aufgeteilt. Zum Beispiel:

 00e4f56c0de1c61fdb926e79e8a0a65bd12930c9 => some/path/00/e4/f5/6c0de1c61fdb926e79e8a0a65bd12930c9.txt

Auf diese Weise müssen Sie nur die SHA-1-Digest der Datei in Datenbank speichern. Sie können dann immer den richtigen Ort und den Namen der Datei herausfinden.

Verzeichnisse haben normalerweise auch eine maximale Anzahl von Dateien, die sie enthalten können, beispielsweise maximal 32000 Unterverzeichnisse und Dateien pro Verzeichnis. Eine auf dieser Art von Hashing basierende Verzeichnisstruktur macht es unwahrscheinlich, dass Sie zu viele Dateien in demselben Verzeichnis speichern. Auch die Verwendung von Hashing wie diese Stellen Sie sicher, dass jedes Verzeichnis etwa die gleiche Anzahl von Dateien enthält. Sie werden nicht in die Situation geraten, in der sich alle Ihre Dateien im selben Verzeichnis befinden.

Andere Tipps

Die Idee ist nicht Ändern Sie den Dateiinhalt, sondern den Namen (und den Pfad) unter Verwendung eines Hash -Werts.

Das Ändern des Inhalts mit einem Hash wäre katastrophal, da ein Hash normalerweise nicht reversibel ist.

Ich bin mir der Motivation für die Verwendung a nicht sicher Hash anstelle des Dateinamens (oder sogar anstelle einer langen Zufallszahl), aber hier sind einige Vorteile der Hash -Beurteilung:

  • Die Dateinamen auf der Festplatte sind einheitlich
  • Die oberen oder unteren Teile des Hash -Wertes können verwendet werden, um die Verzeichnisse zu benennen und daher die Dateien relativ einheitlich zu verteilen
  • Der Name wird zu einem Code, der es jemandem schwierig macht, a) einen Dateinamen zu erraten b) Bildern kategorisieren (würde jemand den Inhalt der Festplatte stehlen)
  • in der Lage sein, den Dateinamen und den Speicherort aus dem Dateiinhalt selbst abzurufen (vorausgesetzt, der Hash stammt aus solchen Inhalten. (Nicht ganz sicher, welcher Anwendungsfall dies beinhaltet ... ein bisschen widersprach ...)

Das allgemeine Interesse an der Verwendung eines Hashs ist, dass ein Hash im Gegensatz zu einem Dateinamen bedeutungslos ist, und daher müsste die Datenbank Bilder und "bibliografische" Typdaten (Name des Uploaders, Datum des Uploads, Tags, ...) verlangen

Wenn ich darüber nachdenke und die Referenz neu lese, sehe ich im Vergleich zu einer zufälligen Zahl nicht wirklich einen großen Vorteil eines Hashs im Vergleich zu einer zufälligen Zahl ...

Darüber hinaus ... einige Hashes erzeugen einen numerischen Wert, der typischerweise in hexadezimal ausgedrückt wird (wie in der bezeichneten Frage zu sehen), und dies könnte als verschwenderisch angesehen werden, indem die Dateinamen länger als nötig werden und damit mehr Stress auf betont werden, und damit mehr Stress an betrachtet Das Dateisystem (größere Verzeichnisse ...)

Die Idee ist, dass Sie einen Namen für das Foto finden müssen und wahrscheinlich die Dateien in einer Reihe von Verzeichnissen zerstreuen möchten. Eine einfache Möglichkeit, einen eindeutigen Namen zu finden, besteht darin, den Hash zu verwenden.

Der Beginn des Hashs wurde also für eine mehrstufige Verzeichnisstruktur abgezogen und der Rest des Hashs für einen Dateinamen für die JPG verwendet.

Dies hat den zusätzlichen Vorteil, doppelte Uploads zu erkennen.

Ein Vorteil, den ich beim Speichern von Dateien mit ihrem Hash sehe, besteht darin, dass die Dateidaten nur einmal gespeichert werden müssen und dann in Ihrer Datenbank mehrmals referenziert werden können. Dadurch sparen Sie Platz, wenn andere Benutzer dieselbe Datei hochladen.

Der Nachteil davon ist jedoch, wenn ein Benutzer die Datei aus Ihrer App löscht, die die Datei nicht einfach physisch von der Festplatte löschen kann, da andere Benutzer, die dieselbe genaue Datei hochgeladen haben, sie möglicherweise noch verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top