В свободное время развлекаю себя тем, что потихонечку добиваю набор своих пылесосов. Вот, некоторое время назад, написалась такая функция…
# coding: utf-8
import os as _os
import hashlib as _hashlib
from subprocess import Popen as _Popen
def file_md5(file, use_system = False):
"""file_md5(file, use_system = False) -> md5sum of "file" as hexdigest string.
"file" may be a file name or file object, opened for read.
If "use_system" is True, if possible use system specific program. This ignore, if file object given."""
if isinstance(file, basestring):
if use_system:
sysname = _os.uname()[0]
if sysname in ('Darwin', 'FreeBSD'):
po = _Popen('md5 -q "%s"' % file, shell=True, stdout=-1, stderr=-1)
po.wait()
m = po.stdout.readline().strip()
if len(m) == 32:
return m
# elif sysname == ...
file = open(file, 'rb')
h = _hashlib.md5()
block = file.read(h.block_size)
while block:
h.update(block)
block = file.read(h.block_size)
return h.hexdigest()
"""
fn = "/Users/Shared/Фильмы/Аниме/Evangelion/Neon Genesis Evangelion - 13.avi"
print file_md5(fn)
print file_md5(open(fn, 'rb'))
print file_md5(fn, True)
import os
os.system('md5 -q "%s"' % fn)
"""
Обратите внимание на use_system и закомментированный elif sysname == …. Собственно хотелось бы довавить ещё систем и в первую очередь Linux. Я помню, что там есть md5sum, но под рукой сейчас нет, чтобы написать и проверить. Зачем это надо? А вы сравните скорость вычисления на какой-нить большом файле и всё поймёте.
P.S. За мой француский сильно не пинайте, и если есть мысли как правильей оформить докстрин, то буду рад подсказке.