delsum delsum ist eine CLI -Anwendung zum Ermitteln von Prüfsummen, die in einer Datei verwendet werden.
Derzeit gibt es drei Unterbefehle:
check : Angesichts einer Spezifikation des Prüfsummenalgorithmus und einer Liste von Dateien wird einfach die Prüfsummen dieser Dateien ausgegeben.part : Angesichts einer Spezifikation des Prüfsummenalgorithmus und einer Liste von Dateien mit entsprechenden Prüfsummen finden Sie Teile der Dateien mit der angegebenen Prüfungsummereverse : Bei einer Liste von Dateien mit entsprechenden Prüfsummen findet dies die verwendeten Prüfsummenparameter checkDieser Unterbefehl berechnet eine Prüfsumme mit einem bestimmten Algorithmus.
Beispiel:
$ 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
Ein Algorithmus kann direkt als Argument mit -m angegeben werden, oder eine Liste von Algorithmen kann in einer Datei bereitgestellt werden.
Der Beginn oder das Ende des Bereichs zur Berechnung der Prüfsumme von -S oder -E wird auch negativ sein, um sie relativ zum Ende zu machen. Um beispielsweise die Prüfsumme aller Bytes mit Ausnahme der letzten beiden zu berechnen, gibt man -S 0 und -E-3 an (es ist inklusive, also -3 ist immer noch Teil der Summe).
Die verfügbaren Algorithmen und die Angabe finden Sie hier.
partDieser Unterbefehl findet alle Teile einer Liste von Dateien, in denen alle angegebenen Prüfsummen übereinstimmen. Die Teile der Datei, die übereinstimmt, müssen die Dateien gleichermaßen erstellen.
Beispiel:
$ 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
In diesem Fall übereinstimmt die Prüfsummen im Teil 0x8:-0x3 , wobei -0x3 relativ vom Ende ist. Dies ist ein integrativer Bereich, was bedeutet, dass eine Prüfsumme, die vom Start bis zum Ende verläuft, den Bereich 0x0:-0x1 hat. Wenn die Dateien von den Größen 15, 16 bzw. 18 Bytes wären, würde diese Ausgabe dies bedeuten
file_a hat die Prüfsumme 1234 von Byte 8 bis 13file_b hat die Prüfsumme 5678 von Byte 8 bis 14file_c hat Prüfsumme abcd von Byte 8 bis 16 Man kann auch das Ende der Teile vom Beginn der Datei (und nicht am Ende) mit dem -s -Flag relativ sein. Darüber hinaus erlauben die -S und -E einen, wo die Bereiche beginnen und enden, indem sie Bereiche angeben (auch inklusive). Wenn beispielsweise die Bereiche 0x1:0xa , 0x3:0x10 und 0x4:0xb ausgegeben werden, würde das Angeben von -S0x0:0x3 nur zulassen, dass der Startteil der Bereiche zwischen 0 und 3 inklusive liegt, sodass 0x4 nicht gedruckt werden würde. Dies kann dazu beitragen, Fehlalarme zu vermeiden und auch die Ausführungszeit zu verkürzen.
Es besteht eine geringe Chance, dass es ausgeben wird, dass etwa 0x1,0x6:0x5,0x10 ausgegeben wird. Dies bedeutet nur, dass jede Kombination möglich ist. In diesem Fall hätte man 0x1:0x5 , 0x1:0x10 und 0x6:0x10 . Während 0x6:0x5 theoretisch auch eine Wahl wäre, ist es kein gültiges, da es rückwärts ist.
Durch die Nutzung der Linearität der Prüfsummen kann dieser gesamte Vorgang in grob loglinearischer Zeit durchgeführt werden. Beachten Sie jedoch, dass er einen großen (linearen) Space Overhead hat und Ihnen möglicherweise keinen Speicher mehr hat, wenn Sie sie auf einer Reihe von 500 -MB -Dateien ausführen.
Man kann auch eine Liste von Algorithmen in einer Datei als Eingabe für -M angeben. Dies kann nützlich sein, da einfach die häufigsten Prüfsummen -Algorithmus einlegen und aussehen, ob Algorithmen in einem Teil der Dateien über die gewünschte Überprüfung verfügen. Die verfügbaren Algorithmen und die Angabe finden Sie hier.
reverseDieser Unterbefehl findet Parameter eines Prüfsummenalgorithmus.
Bei bestimmten Dateien und Prüfsummen durchsucht es diese Algorithmusparameter, für die die gesamten Dateien über die angegebenen Prüfsummen verfügen.
Beachten Sie, dass zumindest der grundlegende Algorithmus und die Breite der Prüfsumme angegeben werden müssen (z. B. crc width=32 ). Die verfügbaren Algorithmen und die Angabe finden Sie hier.
Beispiel:
$ 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
Sie benötigen im Allgemeinen 3 Dateien, und für andere Algorithmen als modsum muss mindestens eine der Dateien eine andere Länge haben. Es ist auch möglich, einige Parameter des Algorithmus anzugeben (zum Beispiel -m 'crc width=32 init=0' ), der weniger Dateien benötigt oder weniger falsch -positives Ergebnis ergibt.
Wenn Sie nur Dateien mit einer bestimmten Länge haben, sich aber auch nur um Prüfsummen dieser Länge kümmern, können Sie für einen Algorithmus nicht um modsum init=0 festlegen.
Es ist normalerweise ziemlich schnell; Zum Beispiel liegt die Laufzeit für den CRC -Umkehralgorithmus in den meisten Fällen um O(n*log^2(n)*log(log(n))) um, wobei n die Dateigröße ist, was dem schnellen GCD -Algorithmus in den NTL- und GF2X -Bibliotheken zu verdanken ist.
Bei einigen Parametern werden wahrscheinlich nur wahrscheinlich Kombinationen durchsucht:
wordsize wird nach Kräften von 2 Vielfachen von 8 gesucht, die kleiner oder gleich der width sindrefin und refout werden nach refin = refout gesucht Um diese Parameter zu durchsuchen, geben Sie sie entweder manuell an oder verwenden Sie das CLI-Argument --extended-search .
Derzeit gibt es drei Familien von Algorithmen: modsum , fletcher und crc . Sie werden so angegeben: algofamiliy width=123 para1=ff para2=true para3=10 name="algoname" . Beachten Sie, dass alle numerischen Parameter mit Ausnahme width und wordsize hexadezimal sind.
Gegenwärtig sind diese gemeinsamen Sumentypen geteilt:
width : Breite der Prüfsumme in Bitsout_endian : Endian der Prüfsumme, kann entweder little oder big seinwordsize : Anzahl der Bits eines Wortes im Eingabtext. Muss ein Vielfaches von 8 und zwischen 8 und 64 sein. In einer einfachen Prüfsumme würde beispielsweise mit wordsize=16 die Datei in 16-Bit-Ganzzahlen einhacken und das Modulo- module hinzufügen.in_endian : Der Endian der Eingangswörter kann entweder little oder big sein.modsum Eine einfache modulare Summe mit Parametern width , init und module .
Entspricht
sum = init
for byte in file:
sum = (sum + byte) % module
return sum
Beachten Sie, dass es für ein module von 0 gleich 2^width entspricht.
Die Standardwerte für module und init sind beide 0.
fletcher Eine fletcherähnliche Summe mit Parametern width , init , addout , module und swap .
Entspricht
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
Es wird in einer "verpackten" Form ausgegeben, in der der SUM1 in der niedrigeren Breite/2 Bits und SUM2 in der höheren Breite/2 gespeichert ist (oder im Gegenteil, wenn swap aktiviert ist). Die Parameter sind:
width : Die Breite der gesamten gepackten Prüfsumme. Obligatorisch.module : Der Wert, nach dem man reduzieren kann. module = 0 bedeutet 2^(width/2) und ist der Standardwert.init : Der Wert zur Initialisierung der regulären Prüfsumme mit. Standardmäßig 0.addout : Der gepackte Wert, der am Ende der Summe hinzugefügt wird. Der hohe Teil wird immer zum hohen Teil der Prüfsummen am Ende hinzugefügt, unabhängig vom swap . Standardmäßig 0.swap : Die booleale Flagge, die angibt, dass die reguläre Summe in der höheren Hälfte der gepackten Prüfsumme liegen sollte. Standardmäßig false .crcEin CRC -Algorithmus mit Parametern gemäß dem RockSoft^TM -Modell, wie in "Eine schmerzlose Anleitung zur CRC -Fehlererkennung" dokumentiert.
Es hat die folgenden Parameter:
width : Die Breite in Bits der Prüfsumme (und Grad von Poly). Obligatorisch.poly : Das Generatorpolynom in normaler Notation. Obligatorisch (mit Ausnahme reverse ).init : Der Anfangswert des CRC -Zustands. Standardmäßig 0.xorout : Der Endwert für XOR zur Summe. Standardmäßig 0.refin : Die boolesche Flagge, die angibt, ob die Bits der Eingangsbytes reflektiert werden sollen. Standardmäßig false .refout : Das boolesche Flag, das angibt, ob die Bits der endgültigen Prüfsumme reflektiert werden sollen, bevor xorout hinzugefügt wird. Standardmäßig false . Beachten Sie, dass andere Werte für wordsize mit in_endian=little (der Standard) das gleiche sind wie das Austausch der Bytes in jeder Gruppe von wordsize bevor die wordsize=8 -Prüfsumme berechnet wird.
Einige (unvollständige) Erläuterungen der verwendeten Algorithmen finden Sie hier.
Es gibt einen Linux -Build, in dem die NTL -Bibliothek hier zusammengestellt ist. Beachten Sie jedoch, dass sie ohne modernste X86 -Erweiterungen zusammengestellt wird und daher einige optimierte Routinen in gf2x nicht nutzen kann, wodurch CRC viel schneller umgekehrt wird. Ich bin auch zu dumm, weil ich einen Fensterbau erstellt habe, also tut mir leid.
Dieses Programm verbindet mit NTL , gf2x und gmp .
Wenn Sie in einem Debian-basierten System sind, können Sie sie mit installieren
apt-get install libgmp-dev libgf2x-dev libntl-dev
Sie können sie auch selbst kompilieren, sehen Sie hier. Dies macht im Allgemeinen die schnellste binäre, da die Anweisungssatzverlängerungen verwendet werden können und es auch möglich ist, die Algorithmusparameter abzustimmen.
Wenn Sie cargo installiert haben, sollte dies möglich sein, dies in der Projektverzeichnis -Root mit zu kompilieren
cargo install --path .
oder ohne das Repository mit herunterzuladen, mit
cargo install delsum
Wenn Sie die NTL -Bibliothek statisch verknüpfen möchten, können Sie die Umgebungsvariable DELSUM_STATIC_LIBS=1 beim Ausführen cargo festlegen.
Der Code dieses Projekts ist unter der MIT -Lizenz lizenziert.