W3docs

crc32()

Die Funktion crc32() berechnet die zyklische Redundanzprüfsumme eines Strings und gibt sie als 32-Bit-Integer zurück.

Die PHP-Funktion crc32() berechnet den CRC-32 (Cyclic Redundancy Check) eines Strings und gibt ihn als 32-Bit-Integer zurück. CRC-32 ist eine schnelle, schlanke Prüfsumme: Sie verwandelt jeden string in einen kurzen Fingerabdruck, mit dem sich später erkennen lässt, ob sich die Daten verändert haben (zufällige Beschädigung beim Download, ein Datenträgerfehler, ein gekipptes Bit). Es handelt sich um ein Erkennungswerkzeug, kein Sicherheitswerkzeug — siehe die Hinweise unten.

Diese Seite behandelt die Syntax, die Signed-vs.-Unsigned-Falle, die die meisten stolpern lässt, ein ausführbares Beispiel, eine realistische Integritätsprüfung und wann man besser auf einen echten Hash zurückgreift.

Syntax

crc32(string $string): int

Die Funktion nimmt einen einzigen Parameter entgegen — den zu analysierenden $string — und gibt die CRC-32-Prüfsumme als Integer zurück.

Die Signed-vs.-Unsigned-Falle

CRC-32 ist konzeptionell ein 32-Bit-vorzeichenloser Wert (0 bis 4.294.967.295). Auf 64-Bit-Plattformen gibt PHP ihn als normalen positiven Integer zurück. Auf 32-Bit-Plattformen umlaufen Werte über 2.147.483.647 und werden negativ zurückgegeben. Um überall denselben vorzeichenlosen Wert zu erhalten, formatiert man ihn mit %u:

$unsigned = sprintf('%u', crc32($str)); // immer positiv, als string

Einfaches Beispiel

php— editable, runs on the server

Wir übergeben den string an crc32() und verpacken ihn in sprintf('%u', ...), damit das Ergebnis auf jeder Plattform konsistent ist. Die Ausgabe dieses Codes lautet:

3964322768

Viele Tools (und die cksum-/Zip-Welt) zeigen CRC-Werte in hexadezimaler Schreibweise an. Um das zu erreichen, formatiert man mit %08X für einen nullaufgefüllten 8-stelligen Hex-string:

<?php
echo sprintf('%08X', crc32("Hello, World!")); // EC4AC3D0
?>

Datenintegrität prüfen

Der eigentliche Einsatzzweck von CRC-32 ist die Erkennung von Veränderungen. Man berechnet und speichert eine Prüfsumme einmalig, berechnet sie später erneut und vergleicht — weichen die beiden voneinander ab, wurden die Daten verändert. Hier ein in sich geschlossenes Beispiel, das eine Prüfsumme speichert und dann eine Kopie dagegen prüft:

<?php
$data = "important payload";

// Compute and store the checksum once (e.g. in a manifest or database).
$expected_crc = crc32($data);

// Later, recompute it for the data you received and compare.
$received = "important payload";
$actual_crc = crc32($received);

if ($actual_crc === $expected_crc) {
    echo "OK: data is intact.";
} else {
    echo "FAIL: data has changed.";
}
?>

Dies gibt OK: data is intact. aus. Um eine echte Datei zu prüfen, ersetzt man den string durch crc32(file_get_contents($filename)). Verwende den strikten ===-Vergleich, damit PHP sowohl den Wert als auch den Typ vergleicht — und falls die erwartete Prüfsumme als Hex-string aus einer externen Quelle kommt, wandelt man sie zuerst mit (int) hexdec($expected_crc) um.

Wichtige Hinweise

  • Nicht kryptografisch sicher. CRC-32 lässt sich trivial fälschen — ein Angreifer kann unterschiedliche Daten mit derselben Prüfsumme erstellen. Verwende es ausschließlich zur Erkennung zufälliger Fehler, niemals für Passwörter, Signaturen oder Manipulationsschutz.
  • Kollisionen kommen vor. Mit nur ~4,3 Milliarden möglichen Werten können zwei verschiedene Strings dieselbe Prüfsumme haben. Das ist für die Korruptionserkennung akzeptabel, aber nicht zur eindeutigen Identifikation von Daten geeignet.
  • Für Sicherheit oder Content-Adressierung einen echten Hash verwenden. Greife auf md5(), sha1() oder das moderne hash() (z. B. SHA-256) zurück — und md5_file() / sha1_file() für Dateien.

Zusammenfassung

crc32() ist eine schnelle Methode, einen string für die Erkennung zufälliger Fehler mit einem Fingerabdruck zu versehen — zum Verifizieren von Downloads, Aufspüren beschädigter Datensätze oder zur Plausibilitätsprüfung von Daten während der Übertragung. Denke daran, das Ergebnis mit sprintf('%u', ...) für plattformübergreifende Konsistenz zu normalisieren, und wähle einen kryptografischen Hash, sobald Sicherheit eine Rolle spielt.

Übungen

Übung
Welche Funktion hat die Funktion crc32() in PHP?
Welche Funktion hat die Funktion crc32() in PHP?
Was this page helpful?