Quero que o python leia o EOF para que eu possa obter um hash apropriado, seja sha1 ou md5. Por favor ajude. Aqui está o que tenho até agora:
import hashlib
inputFile = raw_input("Enter the name of the file:")
openedFile = open(inputFile)
readFile = openedFile.read()
md5Hash = hashlib.md5(readFile)
md5Hashed = md5Hash.hexdigest()
sha1Hash = hashlib.sha1(readFile)
sha1Hashed = sha1Hash.hexdigest()
print "File Name: %s" % inputFile
print "MD5: %r" % md5Hashed
print "SHA1: %r" % sha1Hashed
file.read()
faz - ler o arquivo inteiro.read()
método diz?Respostas:
TL; DR usam buffers para não usar toneladas de memória.
Chegamos ao cerne do seu problema, acredito, quando consideramos as implicações de memória de trabalhar com arquivos muito grandes . Não queremos que esse bad boy misture 2 GB de RAM por um arquivo de 2 GB, então, como pasztorpisti aponta, temos que lidar com esses arquivos maiores em pedaços!
O que fizemos foi atualizar nossos hashes desse bad boy em pedaços de 64kb conforme seguimos com o prático método de atualização dândi do hashlib . Dessa forma, usamos muito menos memória do que os 2 GB que seriam necessários para fazer o hash do cara de uma vez!
Você pode testar isso com:
Espero que ajude!
Além disso, tudo isso é descrito na pergunta vinculada no lado direito: Obtenha hash MD5 de arquivos grandes em Python
Termo aditivo!
Em geral, ao escrever python, ajuda a adquirir o hábito de seguir o pep-8 . Por exemplo, em Python, as variáveis são normalmente separadas por sublinhado e não por camelCased. Mas isso é apenas estilo e ninguém realmente se preocupa com essas coisas, exceto as pessoas que têm que ler um estilo ruim ... que pode ser você lendo este código daqui a alguns anos.
fonte
BUF_SIZE
?shasum
binários. A outra resposta listada abaixo (aquela que usa o memoryview) é compatível com outras ferramentas de hashing.Para o cálculo correto e eficiente do valor hash de um arquivo (em Python 3):
'b'
ao modo de arquivo) para evitar problemas de codificação de caracteres e conversão de final de linha.readinto()
para evitar agitação do buffer.Exemplo:
fonte
resource.getpagesize
alguma utilidade aqui, se quiséssemos tentar otimizá-lo de forma dinâmica? E sobre o quêmmap
?Eu proporia simplesmente:
Todas as outras respostas aqui parecem complicar muito. Python já está armazenando em buffer durante a leitura (de maneira ideal, ou você configura esse armazenamento em buffer se tiver mais informações sobre o armazenamento subjacente) e por isso é melhor ler em partes que a função hash considera ideal, o que a torna mais rápida ou pelo menos menos intensiva de CPU para calcule a função hash. Portanto, em vez de desabilitar o buffer e tentar emular você mesmo, você usa o buffer do Python e controla o que deveria estar controlando: o que o consumidor de seus dados acha ideal, o tamanho do bloco hash.
fonte
hash.block_size
é documentado da mesma forma que o 'tamanho do bloco interno do algoritmo de hash'. Hashlib não acha isso ideal . Nada na documentação do pacote sugere queupdate()
prefirahash.block_size
entrada de tamanho. Ele não usa menos CPU se você chamá-lo assim. Suafile.read()
chamada leva a muitas criações de objetos desnecessários e cópias supérfluas do buffer de arquivo para seu novo objeto de chunk bytes.block_size
blocos. Se você não os fornecer nesses chunks, eles terão que armazenar em buffer e esperar que dados suficientes apareçam, ou dividir os dados em pedaços internamente. Então, você pode simplesmente lidar com isso do lado de fora e então simplificar o que acontece internamente. Acho esse ideal. Veja por exemplo: stackoverflow.com/a/51335622/252025block_size
é muito menor do que qualquer tamanho de leitura útil. Além disso, qualquer bloco útil e tamanhos de leitura são potências de dois. Assim, o tamanho da leitura é divisível pelo tamanho do bloco para todas as leituras, exceto possivelmente a última. Por exemplo, o tamanho do bloco sha256 é de 64 bytes. Isso significa queupdate()
é capaz de processar diretamente a entrada sem nenhum buffer de até qualquer múltiplo deblock_size
. Assim, somente se a última leitura não for divisível pelo tamanho do bloco, ela deve armazenar até 63 bytes uma vez. Portanto, seu último comentário está incorreto e não apóia as afirmações que você fez em sua resposta.Programei um módulo capaz de fazer hash de arquivos grandes com diferentes algoritmos.
Use o módulo assim:
fonte
Aqui está um Python 3, solução POSIX (não Windows!) Que usa
mmap
para mapear o objeto na memória.fonte
fonte
echo $USER_INPUT | md5sum > encrypted.txt && cat encrypted.txt
que não lida com hashing de arquivos, especialmente com arquivos grandes.