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.

Siehe auch

Weitere Posts