Domanda

Dopo aver letto Questo, sembra un'ottima idea archiviare i file utilizzando SHA-1 per la directory.

Non ho idea di cosa significhi, tuttavia, tutto quello che so è che SHA-1 e MD5 sono algoritmi di hashing.Se calcolo l'hash SHA-1 utilizzando questa scrittura rubino, e cambio il contenuto del file (che cambia l'hash), come faccio a sapere dove è archiviato il file?

La mia domanda è quindi: quali sono le basi per l'implementazione di un sistema di archiviazione file/SHA-1?

Se tutti i file cambiano continuamente contenuto, esiste una soluzione migliore per archiviarli o devi semplicemente continuare ad aggiornare l'hash?

Sto solo pensando a come creare un sistema di archiviazione di file generico come GoogleDocs, Flickr, Youtube, DropBox, ecc., qualcosa che potresti riutilizzare in ambienti diversi (come l'archiviazione PubMed articoli di giornale o Cramster compiti e test per casa, o semplicemente immagini come su Flickr).Probabilmente li memorizzerei su Amazon EC2.Solo un sistema in modo da poter dire "questo è il modo in cui il 99% delle volte farò l'archiviazione dei file da ora in poi", così posso smettere di pensare a costruire un modo solido/coerente per archiviare i file e affrontare alcuni problemi reali.

È stato utile?

Soluzione

Prima di tutto, se il contenuto dei file cambia, il nome file dell'approccio SHA-digest non è molto adatto, perché il nome e la posizione del file nel filesystem devono cambiare quando cambia il contenuto del file.


Fondamentalmente si calcola prima un digest SHA-1 o MD5 (= valore hash) dal contenuto del file.

Quando hai un digest, ad esempio, 00e4f56c0de1c61fdb926e79e8a0a65bd12930c9, generi un percorso e un nome file dal digest.Ad esempio, dividi i primi caratteri dal digest alla struttura della directory e il resto dei caratteri al nome del file.Per esempio:

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

In questo modo è necessario archiviare solo il digest SHA-1 del file nel database.Potrai quindi sempre trovare la posizione corretta e il nome del file.

Le directory solitamente hanno anche un numero massimo di file che possono contenere, ad esempio un massimo di 32000 sottodirectory e file per directory.Una struttura di directory basata su questo tipo di hashing rende improbabile la memorizzazione di troppi file nella stessa directory.Inoltre, utilizzando l'hashing in questo modo assicurati che ogni directory abbia circa lo stesso numero di file, non ti troverai nella situazione in cui tutti i tuoi file si trovano nella stessa directory.

Altri suggerimenti

L'idea è non per modificare il contenuto del file, ma piuttosto il suo nome (e percorso), utilizzando un valore hash.

Cambiare il contenuto con un hash sarebbe disastroso poiché normalmente un hash non è reversibile.

Non sono sicuro della motivazione per l'utilizzo di a hash piuttosto che il nome del file (o anche piuttosto che un lungo numero casuale), ma ecco alcuni vantaggi dell'approccio hash:

  • i nomi dei file sul disco sono uniformi
  • la parte superiore o inferiore del valore hash può essere utilizzata per denominare le directory e quindi distribuire i file in modo relativamente uniforme
  • il nome diventa un codice, rendendo difficile per qualcuno a) indovinare il nome di un file b) categorizzare le immagini (qualcuno ruberebbe il contenuto del disco rigido)
  • essere in grado di recuperare il nome del file e la posizione dal contenuto del file stesso (assumendo che l'hash provenga da tale contenuto.(non sono del tutto sicuro di quale caso d'uso comporterebbe questo...un po' forzato...)

L'interesse generale dell'utilizzo di un hash è che a differenza del nome di un file, un hash non ha significato, e quindi richiederebbe che il database mettesse in relazione immagini e dati di tipo "bibliografico" (nome dell'autore del caricamento, data di caricamento, tag, ...)

Ripensandoci, rileggendo la risposta SO di riferimento, non vedo davvero molti vantaggi di un hash, rispetto, ad esempio, a un numero casuale...

Inoltre...alcuni hash producono un valore numerico, tipicamente espresso in esadecimale (come visto nella domanda SO a cui si fa riferimento) e questo potrebbe essere visto come uno spreco, rendendo i nomi dei file più lunghi del necessario e quindi mettendo più stress sul file system ( directory più grandi...)

L'idea è che devi trovare un nome per la foto e probabilmente vorrai spargere i file in una serie di directory.Un modo semplice per trovare un nome univoco è utilizzare l'hash.

Quindi l'inizio dell'hash è stato rimosso per una struttura di directory multilivello e il resto dell'hash è stato utilizzato per un nome file per jpg.

Ciò ha l'ulteriore vantaggio di rilevare i caricamenti duplicati.

Un vantaggio che vedo nell'archiviazione dei file utilizzando il loro hash è che i dati del file devono essere archiviati solo una volta e quindi è possibile fare riferimento più volte all'interno del database.Ciò ti farà risparmiare spazio se hai utenti diversi che caricano esattamente lo stesso file.

Tuttavia, lo svantaggio è che quando un utente elimina quello che pensa sia un file dalla tua app, non puoi semplicemente eliminare fisicamente il file dal disco perché altri utenti che hanno caricato lo stesso esatto file potrebbero ancora utilizzarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top