Одновременно вычислите несколько обзоров (md5, sha256)?

Я склонен сказать, что нет никакого простого способа сделать это. Я говорю это, потому что управление версиями нисколько не является standarized процедурой в UNIX/Linux или ни с одним из поставщиков, по крайней мере, на уровне программы.

Предложение могло бы быть должно исследовать установленную информацию о пакете, которая действительно содержит информацию об управлении версиями.

Однако, если люди установят продукты, не используя стандартный диспетчер пакетов для Вашего распределения, то у Вас будет дефектная информация также.

Чтобы быть абсолютно уверенными, необходимо будет, вероятно, пойти с некоторым типом тестирования контрольных сумм между системами.

25
09.01.2017, 01:35
6 ответов

Я не программист Linux, но с тем же вопрос сегодня, я Сделал следующий тест:

#include<unistd.h>
#include<signal.h>
#include<errno.h>
#include<fcntl.h>
#include<cassert>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<iostream>
#include<fstream>
#include<sstream>
#include<list>
using namespace std;
int single_talk(int thread_id){
  fprintf(stderr,"thread %d before fork @%d\n",thread_id,time(0));
  int pid=vfork();
  if(-1==pid){
    cerr << "failed to fork: " << strerror(errno) << endl;
    _exit(-3);//serious problem, can not proceed
  }
  sleep(1);
  fprintf(stderr,"thread %d fork returned %d @%d\n",thread_id,pid,time(0));
  if(pid){//"CPP"
    fprintf(stderr,"thread %d in parent\n",thread_id);
  }else{//"PHP"
    sleep(1);
    fprintf(stderr,"thread %d in child @%d\n",thread_id,time(0));
    if(-1 == execlp("/bin/ls","ls",(char*)NULL)){
      cerr << "failed to execl php : " << strerror(errno) << endl;
      _exit(-4);//serious problem, can not proceed
    }
  }
}
void * talker(void * id){
  single_talk(*(int*)id);
  return NULL;
}
int main(){
  signal(SIGPIPE,SIG_IGN);
  signal(SIGCHLD,SIG_IGN);
  const int thread_count = 44;
  pthread_t thread[thread_count];
  int thread_id[thread_count];
  int err;
  for(size_t i=0;i<thread_count;++i){
    thread_id[i]=i;
    if((err = pthread_create(thread+i,NULL,talker,thread_id+i))){
      cerr << "failed to create pthread: " << strerror(err) << endl;
      exit(-7);
    }
  }
  for(size_t i=0;i<thread_count;++i){
    if((err = pthread_join(thread[i],NULL))){
      cerr << "failed to join pthread: " << strerror(err) << endl;
      exit(-17);
    }
  }
}

Я составил его G ++ -PThread -O REPRO REPRO.CPP и работает с . / REPRO . Что я вижу на выходе, состоит в том, что все происходит одновременно в раундах: сначала все Pthreads Run Vfork, то все ждать секунду, затем «просыпаться» в реальности ребенка, то все детские работают Exec (), потом, наконец, все родители просыпаются вверх.

Для меня это доказывает, что если один Pthread называет VFork, он не приостанавливает другие фитегоры - если это сделало, то они не смогут вызвать VFork () S, пока не вызывается.

-121--109225-

Проверьте PEE Стандартный вход TEE в трубы ») из TORETILS . Это в основном эквивалентно команде Marco Tee , но немного проще ввести.

$ echo foo | pee md5sum sha256sum
d3b07384d113edec49eaa6238ad5ff00  -
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c  -
$ pee md5sum sha256sum <foo.iso
f109ffd6612e36e0fc1597eda65e9cf0  -
469a38cb785f8d47a0f85f968feff0be1d6f9398e353496ff7aa9055725bc63e  -
28
27.01.2020, 19:40

Вы можете использовать для цикла для петли по отдельные файлы, а затем использовать TEE в сочетании с заменой процессов (работает в Bash и ZSH среди других) Труба к разным контрольным оттенкам.

Пример:

for file in *.mkv; do
  tee < "$file" >(sha256sum) | md5sum
done

Вы также можете использовать более двух контрольных камер:

for file in *.mkv; do
  tee < "$file" >(sha256sum) >(sha384sum) | md5sum
done

Это имеет недостаток, что Checksummers не знают имя файла, Потому что он передан как стандартный вход. Если это не приемлемо, вы должны излучает имена файлов вручную. Полный пример:

for file in *.mkv; do
  echo "$file"
  tee < "$file" >(sha256sum) >(sha384sum) | md5sum
  echo
done > hashfilelist
10
27.01.2020, 19:40

Жаль, что утилита 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))

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

6
27.01.2020, 19:40

Вы всегда можете использовать что-то вроде GNU Parallel :

echo "/path/to/file" | parallel 'md5sum {} & sha256sum {}'

. В качестве альтернативы просто запустите один из двух на заднем плане:

md5sum /path/to/file & sha256sum /path/to/file

или, сохраните выход на разные Файлы и запускать несколько заданий в фоновом режиме:

for file in *; do
    md5sum "$file" > "$file".md5 &
    sha256sum "$file" > "$file".sha &
done

, который будет запущен как многие MD5SUM и экземпляров Sha256Sum , поскольку у вас есть файлы, и они все будут работать параллельно, сохраняя их вывод на Соответствующие имена файлов. Тем не менее, это может быть тяжело, если у вас есть много файлов.

5
27.01.2020, 19:40

Из любопытства, уменьшит ли многопоточный Python-скрипт время выполнения, я создал этот digest.py скрипт, который использует threading.threading.queue, threading.queue и hashlib для вычисления хэшей для нескольких файлов.

Многопоточная реализация Python действительно несколько быстрее, чем использование pee с coreutils. Java, с другой стороны, это... мех. Результаты доступны в этом сообщении коммита :

Для сравнения, для файла размером 2.3 гигабайта (min/avg/max/sd секунд для n=10):

  • pee sha256sum md5sum < file: 16.5/16.9/17.4/.305
  • python3 digest.py -sha256 -md5 < file: 13.7/15.0/18.7/1.77
  • python2 digest.py -sha256 -md5 < файл: 13.7/15.9/18.7/1.64
  • jacksum -a sha256+md5 -F '#CHECKSUM{i} #FILENAME'': 32.7/37.1/50/6.91

Выход хэша совместим с выходом, производимым coreutils. Так как длина зависит от алгоритма хэширования, этот инструмент его не печатает. Использование (для сравнения, также было добавлено pee):

$ ./digest.py -sha256 -md5 digest.py
c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2  digest.py
b575edf6387888a68c93bf89291f611c  digest.py
$ ./digest.py -sha256 -md5 <digest.py
c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2  -
b575edf6387888a68c93bf89291f611c  -
$ pee sha256sum md5sum <digest.py
c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2  -
b575edf6387888a68c93bf89291f611c  -
3
27.01.2020, 19:40

JACKSUM - это бесплатная независимая платформа для вычислений и проверки контрольных сумм, CRC (Дайджесты сообщений), а также временные метки файлов. (выдержка из Page Jacksum Man )

Это большой файл знает, он может обработать файлы до 8 экзобайт (= 8 000 000 000 гигабайт), предполагают вашу операционную систему соответственно, ваша файловая система является большим файлом Осознавая тоже. (выдержка из http://www.jonelo.de/java/jacksum/ )

Пример использования:

jacksum -a md5+sha256 -F "#ALGONAME{i} (#FILENAME) = #CHECKSUM{i}" jacksum-testfile

Пример выхода:

md5 (jacksum-testfile) = d41d8cd98f00b204e9800998ecf8427e
sha256 (jacksum-testfile) = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

на Ubuntu, запустить команду APT-Get Установите Jacksum , чтобы получить его.

В качестве альтернативы, исходные коды доступны в

1
27.01.2020, 19:40

Теги

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