delsum delsum 、ファイルで使用されているチェックサムを見つけるためのCLIアプリケーションです。
現在、3つのサブコマンドがあります。
check :チェックサムアルゴリズムの指定とファイルのリストを指定すると、これらのファイルのチェックサムを単純に出力します。part :チェックサムアルゴリズムの指定と、対応するチェックサムを持つファイルのリストを指定すると、これにより、特定のチェックサムがあるファイルの一部が見つかりますreverse :対応するチェックサムを持つファイルのリストが与えられた場合、これは使用されているチェックサムパラメーターを見つけますcheckこのサブコマンドは、特定のアルゴリズムを使用してチェックサムを計算します。
例:
$ delsum check -m 'crc width=32 poly=0x4c11db7 init=0xffffffff xorout=0xffffffff refin=true refout=true' file_a file_b file_c
700b14f5,e1207917,79741cb2
アルゴリズムは、 -mを含む引数として直接指定できます。または、アルゴリズムのリストをファイルに提供できます。
チェックサムを計算する範囲の開始または終了は、 -Sまたは-Eで与えられ、端と比較してそれらを作るために負の場合もあります。たとえば、最後の2つを除くすべてのバイトのチェックサムを計算するには、 -S 0と-E-3を指定します(包括的であるため、 -3まだ合計の一部です)。
利用可能なアルゴリズムとそれらの指定方法については、こちらをご覧ください。
partこのサブコマンドは、すべてが指定されたチェックサムが一致するファイルのリストのすべての部分を見つけます。一致するファイルの部品は、ファイルと同じ承認でなければなりません。
例:
$ delsum part -m 'modsum width=16 module=ffff' -c 1234,5678,abcd file_a file_b file_c
modsum width=16 module=ffff:
0x8:-0x3
この場合、チェックサムはパート0x8:-0x3で一致します。ここで、 -0x3は端から相対的です。これは包括的な範囲です。つまり、最初から最後まで行くチェックサムの範囲は0x0:-0x1です。ファイルがそれぞれサイズ15、16、18バイトの場合、この出力はそれを意味します
file_aは、バイト8から13のチェックサム1234がありますfile_bは、バイト8から14のチェックサム5678がありますfile_cは、BYTE 8から16のCheckSum abcdがあります-sフラグを使用して、ファイルの開始から(端ではなく)部品の端を相対的にすることもできます。さらに、 -Sと-E 、範囲を指定することにより、範囲が始まり、終了する場所(包括的)を制限することができます。たとえば、通常、範囲は0x1:0xa 、 0x3:0x10および0x4:0xbが出力され、 -S0x0:0x3指定は、範囲の開始部分が0〜3の包括的であるため、 0x4印刷されません。これは、誤検知を回避するのに役立ち、実行時間を短縮することもできます。
0x1,0x6:0x5,0x10のようなものが出力される可能性はほとんどありません。これは、各組み合わせが可能であることを意味します。この場合、 0x1:0x5 0x1:0x10および0x6:0x10があります。 0x6:0x5は理論的にも選択肢になりますが、逆方向であるため有効なものではありません。
チェックサムの線形性を活用することにより、このプロセス全体はほぼログニアの時間で実行できますが、大きな(線形)スペースのオーバーヘッドがあり、500MBファイルの束で実行するとメモリがなくなる場合があります。
また、 -Mへの入力としてファイル内のアルゴリズムのリストを提供することもできます。これは、最も一般的な少数のチェックサムアルゴリズムを単純に配置し、ファイルのいずれかの部分にあるアルゴリズムに目的のチェックサムがあるかどうかを調べることができるため、便利です。利用可能なアルゴリズムとそれらの指定方法については、こちらをご覧ください。
reverseこのサブコマンドは、チェックサムアルゴリズムのパラメーターを見つけます。
指定されたファイルとチェックサムを使用すると、ファイル全体に与えられたチェックサムがあるアルゴリズムパラメーターを検索します。
少なくとも基本的なアルゴリズムとチェックサムの幅を指定する必要があることに注意してください(たとえば、 crc width=32 )。利用可能なアルゴリズムとそれらの指定方法については、こちらをご覧ください。
例:
$ delsum reverse -m 'crc width=32' -c 700b14f5,e1207917,79741cb2 file_a file_b file_c
crc width=32 poly=0x4c11db7 init=0xffffffff xorout=0xffffffff refin=true refout=true
通常、3つのファイルが必要であり、 modsum以外のアルゴリズムの場合、少なくとも1つのファイルの長さは異なる必要があります。また、アルゴリズムのいくつかのパラメーターを指定することも可能です(たとえば、 -m 'crc width=32 init=0'を使用)。
特定の長さのファイルのみがあるだけでなく、その長さのチェックサムのみを気にする場合、 modsumではなくアルゴリズムの場合、 init=0を設定するだけです。
通常、非常に速いです。たとえば、CRC逆アルゴリズムの実行時間は、ほとんどの場合O(n*log^2(n)*log(log(n)))の周りにあります。ここで、 nはファイルサイズです。
一部のパラメーターでは、おそらく組み合わせのみが検索されます。
widthが小さいまたは等しい8の2倍のパワーをwordsizeが検索されますrefin and refout refin = refoutを検索しますこれらのパラメーターを検索するには、それらを手動で指定するか、 --extended-search CLI引数を使用します。
現在、アルゴリズムには3つのファミリーがあります: modsum 、 fletcher 、 crc 。これらは次のように指定されています: algofamiliy width=123 para1=ff para2=true para3=10 name="algoname" 。 widthとwordsizeを除くすべての数値パラメーターは16進んでいることに注意してください。
現在、これらはすべての合計タイプを共有されています:
width :ビットのチェックサムの幅out_endian :チェックサムのエンディアンは、 littleでもbigもありますwordsize :入力テキストの単語のビット数。たとえば、8〜64の倍数である必要があります。たとえば、単純なチェックサムでは、 wordsize=16を使用すると、ファイルが16ビット整数に刻まれ、モジュロmoduleが追加されます。in_endian :入力語のエンディアンは、 littleまたはbigなる可能性があります。modsumパラメーターwidth 、 init 、 moduleを備えた単純なモジュラー合計。
に対応します
sum = init
for byte in file:
sum = (sum + byte) % module
return sum
0のmoduleの場合、 2^widthに相当することに注意してください。
moduleとinitのデフォルト値は両方とも0です。
fletcherパラメーターwidth 、 init 、 addout 、 module 、 swapを備えたフレッチャーのような合計。
に対応します
sum1 = init
sum2 = 0
for byte in file:
sum1 = (sum1 + byte) % module
sum2 = (sum2 + sum1) % module
sum1 = (sum1 + addout.sum1) % module
sum2 = (sum2 + addout.sum2) % module
if not swap:
returm (sum2 << (width/2)) | sum1
else:
returm (sum1 << (width/2)) | sum2
SUM1がより高い幅/2ビット、SUM2に高い幅/2に保存される(または、 swapが有効になっている場合は反対)。パラメーターは次のとおりです。
width :パックされたチェックサム全体の幅。必須。module :削減する値。 module = 0 2^(width/2)を意味し、デフォルト値です。init :通常のチェックサムを初期化する値。デフォルトは0です。addout :合計の最後に追加される梱包された値。高い部分は、 swapに関係なく、最後にチェックサムの高い部分に常に追加されます。デフォルトは0です。swap :通常の合計がパックされたチェックサムのより高い半分にあるべきであることを示すブールフラグ。デフォルトはfalseになります。crc「CRCエラー検出の痛みのないガイド」に記載されているように、RockSoft^TMモデルに従ってパラメーターを備えたCRCアルゴリズム。
次のパラメーターがあります。
width :チェックサムのビット(およびポリの程度)の幅。必須。poly :通常の表記で発電機多項式。必須( reverseを除く)。init :CRC状態の初期値。デフォルトは0です。xorout :XORの最終値は合計です。デフォルトは0です。refin :入力バイトのビットを反映するかどうかを示すブールフラグ。デフォルトはfalseになります。refout : xoroutを追加する前に、最終チェックサムのビットを反映するかどうかを示すブールフラグ。デフォルトはfalseになります。 in_endian=little (標準)を使用しwordsize他の値は、 wordsize=8 checksumを計算する前に、 wordsizeビットの各グループのバイトを交換することと同じであることに注意してください。
使用されているアルゴリズムのいくつかの(不完全な)説明はここにあります。
ここにNTLライブラリがコンパイルされているLinuxビルドがありますが、ほとんどの最新のX86拡張機能なしでコンパイルされているため、 gf2xの最適化されたルーチンを利用できないため、CRCがはるかに高速になります。また、Windowsビルドを行うにはあまりにも馬鹿げているので、申し訳ありません。
このプログラムは、 NTL 、 gf2x 、 gmpに対してリンクします。
Debianベースのシステムを使用している場合は、
apt-get install libgmp-dev libgf2x-dev libntl-dev
自分でコンパイルすることもできます。こちらをご覧ください。これにより、一般的に最速のバイナリが作成されます。命令セット拡張機能を使用できるため、アルゴリズムパラメーターを調整する可能性もあります。
cargoが設置されている場合、プロジェクトディレクトリルートにこれをコンパイルすることができるはずです
cargo install --path .
または、リポジトリをダウンロードせずに、
cargo install delsum
NTLライブラリを静的にリンクする場合は、 cargoを実行するときに環境変数DELSUM_STATIC_LIBS=1設定できます。
このプロジェクトのコードは、MITライセンスの下でライセンスされています。