CRC-Prüfsummen von Dateien erstellen
Veröffentlicht von Thomas Fahle am (Permalink)
In der Informatik ist eine Prüfsumme (engl.: checksum) eine einfache Maßnahme zur Gewährleistung von Datenintegrität bei der Datenübermittlung oder -speicherung. Sie wird hauptsächlich bei der Datensicherung und bei der Datenübertragung verwendet. (Quelle: Wikipedia: Prüfsumme.)
Nachfolgend finden Sie ein paar Beispiele zur Erstellung von Prüfsummen über Dateien.
Prüfsummen mit Bordmitteln erstellen
Hier bietet sich unpack() an.
#!/usr/bin/perl use warnings; use strict; use Fcntl; # Standardmodul { local undef $/; # Slurp-Mode - Nur in diesem Block my $file = '/path/to/some/file'; sysopen(FH, $file, O_RDONLY) or die $!; binmode(FH); # Die ganze Datei in den Hauptspeicher einlesen my $CompleteFile = <FH>; close(FH) or die $!; my $checksum; # Berechnet die gleiche Prüfsumme wie sum für System V $checksum = unpack ("%32C*", $CompleteFile) % 32767; print "System V: ", $checksum , "\n"; # 16-bit Prüfsumme berechnen $checksum = unpack ("%16C*", $CompleteFile); print "16-bit: ", $checksum , "\n"; # 32-bit Prüfsumme berechnen $checksum = unpack ("%32C*", $CompleteFile); print "32-bit: ", $checksum , "\n"; } exit();
Diese Methode setzt voraus, dass die Daten bzw. Dateien in den Hauptspeicher passen. Vorteil dieser Methode: Sie funktioniert überall, wo Perl funktioniert.
CRC-32 Prüfsummen mit String::CRC32 erstellen
String::CRC32 von Sönke J. Peters kann CRC32-Prüfsummen von Zeichenketten und Dateien erzeugen. String::CRC32 erzeugt die gleichen CRC Prüfsummen wie ZModem, PKZip und entsprechende andere Programme.
#!/usr/bin/perl use warnings; use strict; use Fcntl; # Standardmodul use String::CRC32; my $file = '/path/to/some/file'; sysopen(FH, $file, O_RDONLY) or die $!; binmode(FH); my $crc = crc32(*FH); close(FH) or die $!; print "CRC32: ", $crc , "\n";
String::CRC32 ist in XS implementiert und läuft sehr schnell. Auch hier gilt, dass die Daten in den Hauptspeicher passen müssen.
CRC32 Prüfsummen mit Digest::CRC erstellen
Digest::CRC von Oliver Maul implementiert das Digest-Interface und kann CRC8-, CRC16-, CRC32- und CRC64-Prüfsummen erstellen.
#!/usr/bin/perl use warnings; use strict; use Fcntl; # Standardmodul # OO style use Digest::CRC; my $file = '/path/to/some/file'; sysopen(FH, $file, O_RDONLY) or die $!; binmode(FH); my $ctx = Digest::CRC->new(type=>"crc32"); $ctx->addfile(*FH); my $digest = $ctx->digest; print "CRC32: ", $digest , "\n"; $digest = $ctx->hexdigest; print "CRC32 (HEX): ", $digest , "\n"; close(FH) or die $!;
Die Datei muss hier nicht in den Hauptspeicher passen, addfile kann auch mit Dateien umgehen, die größer sind als der verfügbare Hauptspeicher.