1

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、同様の役割cksumsum果たしますが、一致するコードを与えません (3915528286 の 16 進数は e962385e です)。

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




アプリケーションの詳細:


多くの大きなファイルを含むファイルシステムがあり、新しいファイルが継続的にコピーされます。着信ファイルの一部は既存のファイルと一致します。この場合、ディスク容量を節約するために、既存のファイルを単純にハードリンクしたいと考えています。解凍されたファイルの場合、md5sum はこの比較を迅速かつ効率的に行うのに役立ちます。一方、gzip されたファイルは、同じデータに対して異なる md5sum を持つことがよくあります (タイムスタンプまたは所有者が原因で、このアプリケーションでは関係ありません)。gzip は内部データのチェックサムを提供するので、2 つの gzip ファイルについて、チェックサムとサイズのリストを単純に比較できます。

また、gzip ファイルと「通常の」ファイルの比較もサポートしたいと考えています。その場合、gzip から外部で同じチェックサムを生成するユーティリティが必要です。簡単な解決策は、比較する前に常にプレーン ファイルを gzip することだと思いますが、これは回避したいオーバーヘッドです。現在、システムは CPU 時間によってボトルネックになっているからです。

4

2 に答える 2

3

簡単に言うと、gzip のソースを確認し、それを cksum のソースと比較し、いくつかの変更を加えたところ、jacksum が gzip と同じ実装を使用していることがわかりました。

だからジャックサムを使ってください。:)

呼び出し: jacksum -a crc32 ファイル名

于 2010-12-11T18:28:32.453 に答える
2

いくつかのベンチマークを実行したところ、jacksum はかなり優れていますが、cksfv よりも時間がかかり、多くのメモリを使用します。

このベンチマークは、によって生成された 4 ギガバイト ファイルの VirtualBox Ubuntu VM で実行されましたcat /dev/urandom。「実際の」マシンではおそらくはるかに高速になりますが、同じ比率である必要があります。

gzip/tempfile メソッドはディスク容量を使い果たしましたが、すでに 2 倍以上の時間を使用していたので気にしません。

$ 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が私の答えだと思います。

于 2010-12-11T20:25:24.843 に答える