Pythonでファイルをハッシュする 質問する

Pythonでファイルをハッシュする 質問する

Python で EOF まで読み込んで、sha1 か md5 かを問わず適切なハッシュを取得できるようにしたいです。助けてください。これまでのところ、次のようになっています。

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

ベストアンサー1

TL;DR 大量のメモリを使用しないようにバッファを使用します。

問題の核心は、記憶への影響を考慮すると、非常に大きなファイル2ギガバイトのファイルのために2ギガのRAMを消費するのは望ましくないので、パストルピスティ指摘されているように、大きなファイルはチャンクで処理する必要があります。

import sys
import hashlib

# BUF_SIZE is totally arbitrary, change for your app!
BUF_SIZE = 65536  # lets read stuff in 64kb chunks!

md5 = hashlib.md5()
sha1 = hashlib.sha1()

with open(sys.argv[1], 'rb') as f:
    while True:
        data = f.read(BUF_SIZE)
        if not data:
            break
        md5.update(data)
        sha1.update(data)

print("MD5: {0}".format(md5.hexdigest()))
print("SHA1: {0}".format(sha1.hexdigest()))

私たちがやったことは、hashlibの便利な機能を使って、この悪党のハッシュを64kbのチャンクで更新することです。更新方法この方法なら、一度にハッシュするのに必要な 2 GB よりもずっと少ないメモリで済みます。

これをテストするには以下を実行します:

$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d  bigfile

また、これらすべては右側のリンクされた質問に概説されています。Pythonで大きなファイルのMD5ハッシュを取得する


追記!

一般的に、Python を書くときは、[pep-8][4] に従う習慣を身に付けると役立ちます。たとえば、Python の変数は通常、キャメルケースではなくアンダースコアで区切られます。しかし、これは単なるスタイルであり、悪いスタイルを読まなければならない人以外は、誰もこれらのことを気にしません...それは、数年後にこのコードを読むあなたかもしれません。

おすすめ記事