Я склонен сказать, что нет никакого простого способа сделать это. Я говорю это, потому что управление версиями нисколько не является standarized процедурой в UNIX/Linux или ни с одним из поставщиков, по крайней мере, на уровне программы.
Предложение могло бы быть должно исследовать установленную информацию о пакете, которая действительно содержит информацию об управлении версиями.
Однако, если люди установят продукты, не используя стандартный диспетчер пакетов для Вашего распределения, то у Вас будет дефектная информация также.
Чтобы быть абсолютно уверенными, необходимо будет, вероятно, пойти с некоторым типом тестирования контрольных сумм между системами.
Я не программист 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 -
Вы можете использовать для цикла
для петли по отдельные файлы, а затем использовать 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
Жаль, что утилита 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))
Полагаю, версия этой программы на С/С++ будет немного быстрее, но не намного, так как большая часть работы выполняется модулем хэшлиба, который это , написанный на С (или С++). И, как Вы отметили выше, узким местом для больших файлов является скорость ввода-вывода.
Вы всегда можете использовать что-то вроде 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
, поскольку у вас есть файлы, и они все будут работать параллельно, сохраняя их вывод на Соответствующие имена файлов. Тем не менее, это может быть тяжело, если у вас есть много файлов.
Из любопытства, уменьшит ли многопоточный 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 -
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
, чтобы получить его.
В качестве альтернативы, исходные коды доступны в