Question

Après avoir lu cette , il sonne comme une bonne idée de stocker des fichiers en utilisant l'algorithme SHA-1 pour le répertoire.

Je ne sais pas ce que cela signifie cependant, tout ce que je sais est que SHA-1 et MD5 sont des algorithmes de hachage. Si je calcule le hachage SHA-1 en utilisant ce script Ruby , et je change de fichier le contenu (qui modifie le hachage), comment puis-je savoir où le fichier est stocké alors?

Ma question est alors, quelles sont les bases de la mise en œuvre d'un système de stockage de fichiers SHA-1 /?

Si tous les fichiers sont contenus changent tout le temps, est-il une meilleure solution pour les stocker, ou avez-vous juste pour garder la mise à jour du hachage?

Je réfléchis sur la façon de créer un fichier générique de stockage système comme GoogleDocs, Flickr, Youtube, DropBox, etc., quelque chose que vous pouvez réutiliser dans des environnements différents (tels que le stockage PubMed des articles de journaux ou les devoirs de Cramster et des tests, ou tout simplement des images comme sur Flickr). Je serais probablement les stocker sur Amazon EC2. Juste un système si je peux dire « voici comment je vais 99% du temps ne fichier stockant à partir de maintenant », donc je peux arrêter de penser à la construction d'une façon solide / cohérente pour stocker des fichiers et obtenir sur certains problèmes réels.

Était-ce utile?

La solution

Tout d'abord, si le contenu des fichiers changent, nom de l'approche SHA-digest est pas très approprié, parce que le nom et l'emplacement du fichier dans le système de fichiers doit changer lorsque le contenu des modifications du fichier.


En gros vous devez d'abord calculer un SHA-1 ou MD5 (= valeur de hachage) à partir du contenu du fichier.

Lorsque vous avez un condensé, par exemple, 00e4f56c0de1c61fdb926e79e8a0a65bd12930c9, vous générer un emplacement de fichier et le nom du digest. Par exemple, vous divisez les premiers caractères de la digestion à la structure du répertoire et des autres caractères du nom du fichier. Par exemple:

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

De cette façon, il vous suffit de stocker le résumé SHA-1 du fichier à la base de données. Vous pouvez toujours trouver le bon emplacement et le nom du fichier.

Annuaires ont généralement aussi nombre maximal de fichiers qu'ils peuvent contenir, par exemple un maximum de 32000 sous-répertoires et fichiers par répertoire. Une structure de répertoire en fonction de ce genre de hashing il est peu probable que vous stockez trop de fichiers à même répertoire. en utilisant également hash comme ceci assurez-vous que chaque répertoire a peu près le même nombre de fichiers, vous ne serez pas dans la situation où tous vos fichiers sont dans le même répertoire.

Autres conseils

L'idée est pas pour modifier le contenu du fichier, mais son nom (et le chemin), en utilisant une valeur de hachage.

Modification du contenu d'un hachage serait désastreux car un hachage est normalement pas réversible.

Je ne suis pas sûr de la motivivation pour utiliser un hachage plutôt que le nom du fichier (ou même plutôt qu'un long nombre aléatoire), mais voici quelques avantages du hachage appraoch:

  • les noms de fichiers sur le disque est uniforme
  • les parties supérieure ou inférieure de la valeur de hachage peuvent être utilisés pour nommer les répertoires et les fichiers répartira relativement uniformément
  • le nom devient un code, ce qui rend difficile pour quelqu'un de    a) deviner un nom de fichier    b) classer les images (ce que quelqu'un voler le contenu du disque dur)
  • être en mesure de récupérer le nom et l'emplacement du contenu du fichier lui-même (en supposant que le hachage provient de ce contenu. (Pas tout à fait sûr, auquel cas l'utilisation impliquerait cette ... un peu contrieved ...)

L'intérêt général d'utiliser un hachage est que, contrairement à un nom de fichier, un hachage est vide de sens, et donc on aurait besoin la base de données de rapporter des images et des données de type « bibliographiques » (nom de Uploader, date de chargement, des étiquettes,. ..)

En pensant à ce sujet, la relecture de la référence SO réponse, je ne vois pas vraiment beaucoup d'un avantage d'un hachage, par rapport à, disons, un nombre aléatoire ...

De plus ... certains hash produisent une valeur numérique, généralement exprimée en hexadécimal (comme on le voit dans la refernced question SO) et cela pourrait être considéré comme inutile, en faisant les noms de fichiers longs qu'ils doivent être, et par conséquent mettre plus de stress sur le système de fichiers (plus grands répertoires ...)

L'idée est que vous avez besoin de trouver un nom pour la photo, et vous voulez probablement disperser les fichiers entre plusieurs répertoires. Un moyen facile de trouver un nom unique est d'utiliser le hachage.

Ainsi, le début du hachage a été décollée pour une structure de répertoires multi-niveaux et le reste du hachage a été utilisé pour un nom de fichier pour le jpg.

Ceci a l'avantage supplémentaire de détecter les téléchargements en double.

Un avantage que je vois avec le stockage des fichiers en utilisant leur hachage est que les données de fichier n'a besoin que de stocker une fois et peut ensuite être référencé plusieurs fois au sein de votre base de données. Cela vous permettra d'économiser l'espace si vous avez un utilisateur différents téléchargeant exactement le même fichier.

Cependant l'inconvénient à cela est lorsqu'un utilisateur supprime ce qu'ils pensent est là fichier à partir de votre application, vous ne pouvez pas supprimer physiquement le fichier à partir du disque parce que d'autres utilisateurs qui ont transféré exactement le même fichier peut encore l'utiliser. Le

scroll top