2011-02-09 13 views
2

hashlibモジュールからのhashlib.md5()関数のファイルのmd5ハッシュを計算しようとしています。Hashlib Pythonモジュールのメソッド更新の最大バイト数

だから、コードのこの部分writedこと:

Buffer = 128 
f = open("c:\\file.tct", "rb") 
m = hashlib.md5() 

while True: 
    p = f.read(Buffer) 
    if len(p) != 0: 
     m.update(p) 
    else: 
     break 
print m.hexdigest() 
f.close() 

を私はそうで64、128、256とで可変値をBuffer増やす場合、関数の更新が高速であると指摘しました。 上限を超えてはいけませんか?私はそれがRAMメモリの問題だけかもしれないと思うが、私は知らない。

答えて

0

バッファの値は、一度に読み込まれてメモリに格納されるバイト数です。したがって、唯一の制限は使用可能なメモリです。

ただし、値が大きくなると自動的には高速になりません。ある時点では、バッファが大きすぎると、メモリページングの問題やメモリ割り当てによるその他の速度低下に陥る可能性があります。速度のリターンが低下するまで、より大きな値と大きい値を試してみる必要があります。

2

任意の大きなファイルを処理できるようにするには、ブロック単位で読み込む必要があります。このようなブロックのサイズは、好ましくは2のべき乗であるべきであり、md5の場合、最小可能ブロックは、アルゴリズムが動作する単位である512ビットブロックであるため、64バイト(512ビット)からなる。

しかし、それを超えて、2048バイトのブロックがの方が良いかどうかを正確に判断しようとすると、4096バイトのブロックよりも ...失敗する可能性があります。これは非常に慎重にテストされ、測定される必要があり、ほとんどの場合、価値は経験から判断して自由に選択されています。

3

チャンクサイズは、MemoryErrorになります。つまり、使用可能なRAM以外の制限はありません。一方bufsizeは私のマシン上で2**31-1によって制限されます。

import hashlib 
from functools import partial 

def md5(filename, chunksize=2**15, bufsize=-1): 
    m = hashlib.md5() 
    with open(filename, 'rb', bufsize) as f: 
     for chunk in iter(partial(f.read, chunksize), b''): 
      m.update(chunk) 
    return m 

ビッグchunksizeは非常に小さなものほど遅くなることがあります。それを測る。

10 MBファイルの場合、私がテストしたファイルのうち、2**15chunksizeが最も高速です。

+0

これは3.1.3でこれを試したところ、空のバイト列と 'iter(部分(f.read、chunksize、b '')'と明示的に比較する必要がありました。 '。 – pix