Pergunta

Depois de ler isto, parece uma ótima idéia armazenar arquivos usando o SHA-1 para o diretório.

Não tenho idéia do que isso significa, no entanto, tudo o que sei é que o SHA-1 e o MD5 são algoritmos de hash. Se eu calcular o hash sha-1 usando Este script rubi, e eu altero o conteúdo do arquivo (que altera o hash), como sei onde o arquivo é armazenado então?

Minha pergunta é então: quais são os conceitos básicos de implementar um sistema SHA-1/Arquivo de armazenamento?

Se todos os arquivos estão alterando o conteúdo o tempo todo, existe uma solução melhor para armazená -los ou você só precisa continuar atualizando o hash?

Só estou pensando em como criar um sistema de armazenamento de arquivos genéricos, como GoogleDocs, Flickr, YouTube, Dropbox, etc., algo que você pode reutilizar em diferentes ambientes (como armazenar PubMed Artigos de periódicos ou Cramster Trabalho de casa e testes, ou apenas imagens como no Flickr). Eu provavelmente os armazenaria na Amazon EC2. Apenas algum sistema para que eu possa dizer "é assim que eu vou ter 99% do tempo que o arquivo armazenando a partir de agora", para que eu possa parar de pensar em criar uma maneira sólida/consistente de armazenar arquivos e aprofundar alguns problemas reais.

Foi útil?

Solução

Antes de tudo, se o conteúdo dos arquivos estiver mudando, o nome do arquivo da abordagem SHA-Digest não será muito adequado, porque o nome e o local do arquivo no sistema de arquivos devem mudar quando o conteúdo do arquivo for alterado.


Basicamente, você primeiro calcula um resumo SHA-1 ou MD5 (= valor do hash) a partir do conteúdo do arquivo.

Quando você tem um resumo, por exemplo, 00e4f56c0de1c61fdb926e79e8a0a65bd12930c9, você gera um local de arquivo e nome de arquivo a partir do resumo. Por exemplo, você dividiu os primeiros caracteres da estrutura Digest to Directory e o restante dos caracteres para arquivar o nome. Por exemplo:

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

Dessa forma, você só precisa armazenar o resumo SHA-1 do arquivo no banco de dados. Você sempre pode descobrir o local certo e o nome do arquivo.

Os diretórios geralmente também têm o número máximo de arquivos que eles podem conter, por exemplo, no máximo de 32000 subdiretos e arquivos por diretório. Uma estrutura de diretório com base nesse tipo de hash torna improvável que você armazene muitos arquivos para o mesmo diretório. Também usando hash como esse, certifique -se de que todo diretório tenha o mesmo número de arquivos, você não entrará na situação em que todos os seus arquivos estão no mesmo diretório.

Outras dicas

A ideia é não Para alterar o conteúdo do arquivo, mas sim seu nome (e caminho), usando um valor de hash.

Alterar o conteúdo com um hash seria desastroso, pois um hash normalmente não é reversível.

Não tenho certeza da motivação para usar um cerquilha Em vez do nome do arquivo (ou mesmo em vez de um número aleatório longo), mas aqui estão algumas vantagens do hash Appraoch:

  • Os nomes dos arquivos no disco são uniformes
  • As partes superior ou inferior do valor de hash podem ser usadas para nomear os diretórios e, portanto, distribuir os arquivos de maneira relativamente uniforme
  • O nome se torna um código, dificultando alguém para a) adivinhar um nome de arquivo b) categorizar imagens (alguém roubaria o conteúdo do disco rígido)
  • Ser capaz de recuperar o nome do arquivo e a localização do próprio conteúdo do arquivo (assumindo que o hash vem desse conteúdo (não tenho certeza de qual caso de uso envolveria isso ... um pouco contratado ...)

O interesse geral de usar um hash é que, diferentemente de um nome de arquivo, um hash não tem sentido e, portanto, exigiria que o banco de dados relacionasse imagens e dados do tipo "bibliográfico" (nome do uploader, data de upload, tags, ...)

Ao pensar sobre isso, relendo a resposta referenciada, eu realmente não vejo muita vantagem de um hash, como comparado a, digamos, um número aleatório ...

Além disso ... Alguns hashes produzem um valor numérico, normalmente expresso em hexadecimal (como visto na pergunta referida) e isso pode ser visto como um desperdício, tornando os nomes de arquivos mais longos do que precisam ser e, portanto, colocando mais estresse O sistema de arquivos (diretórios maiores ...)

A idéia é que você precise criar um nome para a foto e provavelmente deseja espalhar os arquivos entre vários diretórios. Uma maneira fácil de criar um nome único é usar o hash.

Portanto, o início do hash foi retirado para uma estrutura de diretório de vários níveis e o restante do hash foi usado para um nome de arquivo para o JPG.

Isso tem o benefício adicional de detectar uploads duplicados.

Uma vantagem que vejo com o armazenamento de arquivos usando o hash é que os dados do arquivo precisam ser armazenados apenas uma vez e depois podem ser referenciados várias vezes no seu banco de dados. Isso economizará espaço se você tiver usuários diferentes, enviando exatamente o mesmo arquivo.

No entanto, a desvantagem disso é quando um usuário exclui o que eles acham que estão lá o arquivo do seu aplicativo, você não pode simplesmente excluir fisicamente o arquivo do disco porque outros usuários que carregaram o mesmo arquivo exato ainda podem estar usando -o.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top