Есть ли какой-либо внешний инструмент, который даст соответствующую контрольную сумму для gzip -lv?

gzip выдаст контрольную сумму каждого файла при задании параметров -l и -v, например:

$ echo foo > foo
$ gzip foo
$ gzip -lv foo.gz
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 7e3265a8 Dec 10 17:37                  28                   4 150.0% foo

Есть ли какой-либо внешний инструмент, с помощью которого я могу получить ту же контрольную сумму?

md5sum, cksum и sum выполняют аналогичную роль, но не дают совпадающий код (шестнадцатеричное число 3915528286 равно e962385e).

$ echo foo > foo
$ md5sum foo
d3b07384d113edec49eaa6238ad5ff00  foo
$ cksum foo
3915528286 4 foo
$ sum foo
00106     1




Дополнительная информация о приложении:


У нас есть файловая система со многими большими файлами, и новые файлы постоянно копируются. Некоторые из входящих файлов соответствуют уже существующим файлам, и в этом случае мы хотели бы просто жестко связать уже существующий файл, чтобы сэкономить место на диске. Для разархивированных файлов md5sum помогает нам сделать это сравнение быстро и эффективно. С другой стороны, gzip-файлы часто имеют разные md5sum для идентичных данных (из-за метки времени или владельца, что не имеет значения в этом приложении). Я заметил, что gzip предоставит контрольную сумму для внутренних данных, поэтому для двух gzip-файлов я могу просто сравнить списки контрольных сумм плюс размеры.

Я также хотел бы поддержать сравнение файла gzip с «обычным» файлом, и в этом случае мне нужна утилита, которая будет генерировать ту же контрольную сумму извне из gzip. Я предполагаю, что простое решение состоит в том, чтобы всегда сжимать простой файл перед сравнением, но это накладные расходы, которых я хотел бы избежать, поскольку наша система в настоящее время ограничена процессорным временем.


person bukzor    schedule 10.12.2010    source источник


Ответы (2)


Короче говоря, я просмотрел исходный код gzip, сравнил его с исходным кодом cksum, внес некоторые изменения и обнаружил, что jacksum использует ту же реализацию, что и gzip.

Так что используйте jacksum. :)

вызов: jacksum -a имя файла crc32

person OmnipotentEntity    schedule 11.12.2010
comment
Именно то, что я искал. Спасибо! Позвольте мне сделать несколько тестов, прежде чем я приму ответ - person bukzor; 11.12.2010

Я только что провел несколько тестов, и хотя jacksum довольно хорош, он занимает немного больше времени и использует гораздо больше памяти, чем cksfv.

Этот тест был выполнен на виртуальной машине VirtualBox Ubuntu на файле размером четыре гигабайта, сгенерированном cat /dev/urandom. Вы, вероятно, получите гораздо лучшие скорости на «настоящей» машине, но они должны быть в том же соотношении.

Методу gzip/tempfile не хватило места на диске, но мне все равно, потому что он уже использовал более чем в два раза больше времени.

$ cksum random.dat
1591530146 4388388864 random.dat
5.78user 7.42system 2:53.62elapsed 7%CPU (0avgtext+0avgdata 2896maxresident)k
8480936inputs+0outputs (0major+225minor)pagefaults 0swaps

$ md5sum random.dat
3d6f60f84b2289992abd66428e8a73c4  random.dat
5.57user 8.25system 2:25.97elapsed 9%CPU (0avgtext+0avgdata 2656maxresident)k
8480960inputs+0outputs (1major+209minor)pagefaults 0swaps

$ jacksum -x -a crc32 random.dat
c93b4e20        4388388864      random.dat
3.65user 10.82system 2:19.69elapsed 10%CPU (0avgtext+0avgdata 52224maxresident)k
8490688inputs+152outputs (60major+3936minor)pagefaults 0swaps

$ cksfv random.dat
; Generated by cksfv v1.3.14 on 2010-12-11 at 12:06.31
; Project web site: http://www.iki.fi/shd/foss/cksfv/
;
;     93421568  11:16.12 2010-12-11 random.dat
random.dat C93B4E20
4.42user 8.65system 2:14.42elapsed 9%CPU (0avgtext+0avgdata 2048maxresident)k
8480944inputs+0outputs (1major+171minor)pagefaults 0swaps

$ bash -c gzip -c random.dat > temp.gz && gzip -lv temp.gz

gzip: stdout: No space left on device
Command exited with non-zero status 1
55.54user 6.68system 4:31.56elapsed 22%CPU (0avgtext+0avgdata 4992maxresident)k
2596536inputs+2689840outputs (3major+695minor)pagefaults 0swaps

Думаю, мой ответ — cksfv.

person bukzor    schedule 11.12.2010