Сравните три файла и распечатайте самое высокое значение

Жаль, что утилита openssl не принимает несколько команд дайджеста; думаю, выполнение одной и той же команды на нескольких файлах - более распространенный шаблон использования. FWIW, версия утилиты openssl на моей системе (Mepis 11) имеет команды только для sha и sha1, а не для любого другого варианта sha. Но у меня есть программа под названием sha256sum, а также md5sum.

Вот простая программа Python, dual_hash.py, которая делает то, что вы хотите. Блок размером 64k кажется оптимальным для моей машины (Intel Pentium 4 2.00GHz с 2G оперативной памяти), YMMV. Для небольших файлов его скорость примерно такая же, как при последовательном запуске md5sum и sha256sum. Но для больших файлов она значительно быстрее. Например, на файле 1967063040 байт (образ диска SD карты, полной mp3 файлов), md5sum + sha256sum занимает около 1m44.9s, dual_hash.py - 1m0.312s.

dual_hash.py

#! /usr/bin/env python

''' Calculate MD5 and SHA-256 digests of a file simultaneously

    Written by PM 2Ring 2014.10.23
'''

import sys
import hashlib

def digests(fname, blocksize):
    md5 = hashlib.md5()
    sha = hashlib.sha256()
    with open(fname, 'rb') as f:
        while True:
            block = f.read(blocksize)
            if not block:
                break
            md5.update(block)
            sha.update(block)

    print("md5: %s" % md5.hexdigest())
    print("sha256: %s" % sha.hexdigest())

def main(*argv):
    blocksize = 1<<16 # 64kB
    if len(argv) < 2:
        print("No filename given!\n")
        print("Calculate md5 and sha-256 message digests of a file.")
        print("Usage:\npython %s filename [blocksize]\n" % sys.argv[0])
        print("Default blocksize=%d" % blocksize)
        return 1

    fname = argv[1]

    if len(argv) > 2:
        blocksize = int(sys.argv[2])

    print("Calculating MD5 and SHA-256 digests of %r using a blocksize of %d" % (fname, blocksize))
    digests(fname, blocksize)

if __name__ == '__main__':
    sys.exit(main(*sys.argv))

Полагаю, версия этой программы на С/С++ будет немного быстрее, но не намного, так как большая часть работы выполняется модулем хэшлиба, который это , написанный на С (или С++). И, как Вы отметили выше, узким местом для больших файлов является скорость ввода-вывода.

0
27.05.2014, 01:01
3 ответа
[1180888] С помощью GNU awk

1
28.01.2020, 02:17
[1180750] Попробуйте что-нибудь вроде:
  • $1""[1181065] используется для того, чтобы заставить $1 войти в контекст строки, так что выполняется сравнение строк...[1180753]
  • 3
    28.01.2020, 02:17
    [1181336]
    1
    28.01.2020, 02:17

    Теги

    Похожие вопросы