かなりメモリ効率の悪い方法があります。
単一ファイル:
import hashlib
def file_as_bytes(file):
with file:
return file.read()
print hashlib.md5(file_as_bytes(open(full_path, 'rb'))).hexdigest()
ファイルのリスト:
[(fname, hashlib.md5(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
ただし、MD5は壊れていることがわかっているため、脆弱性の分析は非常に難しいため、目的に使用しないでください。また、セキュリティの問題のためにコードを将来使用する可能性を分析することは不可能です。私見、ライブラリから完全に削除する必要があるので、それを使用するすべての人は更新を余儀なくされます。だから、代わりにあなたがすべきことはここにあります:
[(fname, hashlib.sha256(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
128ビット相当のダイジェストだけが必要な場合は、これを行うことができます.digest()[:16]
。
これにより、タプルのリストが表示されます。各タプルには、ファイルの名前とハッシュが含まれています。
ここでも、MD5の使用について強く質問します。少なくともSHA1を使用している必要があり、SHA1で発見された最近の欠陥を考えると、おそらくそれさえありません。「暗号化」の目的でMD5を使用していない限り、大丈夫だと考える人もいます。しかし、物事は当初予想したよりも範囲が広くなる傾向があり、カジュアルな脆弱性分析は完全に欠陥があることが判明する可能性があります。ゲートから適切なアルゴリズムを使用する習慣を身に付けることが最善です。別の文字を入力するだけです。それほど難しいことではありません。
これはより複雑ですが、メモリ効率が良い方法です:
import hashlib
def hash_bytestr_iter(bytesiter, hasher, ashexstr=False):
for block in bytesiter:
hasher.update(block)
return hasher.hexdigest() if ashexstr else hasher.digest()
def file_as_blockiter(afile, blocksize=65536):
with afile:
block = afile.read(blocksize)
while len(block) > 0:
yield block
block = afile.read(blocksize)
[(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.md5()))
for fname in fnamelst]
また、MD5は壊れており、実際にはもう使用すべきではないので、
[(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.sha256()))
for fname in fnamelst]
繰り返しになりますが、128ビット相当のダイジェストだけが必要な場合[:16]
は、呼び出しの後に置くことができhash_bytestr_iter(...)
ます。
md5sum
ですか?