W3docs

crc32()

La fonction crc32() calcule une somme de contrôle de redondance cyclique d'une chaîne et retourne un entier 32 bits.

La fonction PHP crc32() calcule le CRC-32 (Cyclic Redundancy Check) d'une chaîne et le retourne sous forme d'entier 32 bits. CRC-32 est une somme de contrôle rapide et légère : elle transforme n'importe quelle chaîne en une courte empreinte, ce qui permet de détecter ultérieurement si les données ont changé (corruption accidentelle lors d'un téléchargement, erreur disque, bit inversé). C'est un outil de détection, pas un outil de sécurité — consultez les notes ci-dessous.

Cette page couvre la syntaxe, le piège signé/non signé qui déroute la plupart des gens, un exemple exécutable, un contrôle d'intégrité réaliste, et quand utiliser un vrai hash à la place.

Syntaxe

crc32(string $string): int

Elle prend un seul paramètre — la $string à analyser — et retourne la somme de contrôle CRC-32 sous forme d'entier.

Le piège signé vs non signé

CRC-32 est conceptuellement une valeur non signée 32 bits (de 0 à 4 294 967 295). Sur les plateformes 64 bits, PHP le retourne comme un entier positif normal. Sur les plateformes 32 bits, les valeurs supérieures à 2 147 483 647 dépassent et reviennent négatives. Pour obtenir la même valeur non signée partout, formatez avec %u :

$unsigned = sprintf('%u', crc32($str)); // always positive, as a string

Exemple de base

php— editable, runs on the server

On passe la chaîne à crc32() et on l'enveloppe dans sprintf('%u', ...) pour que le résultat soit cohérent sur toutes les plateformes. La sortie de ce code est :

3964322768

De nombreux outils (et le monde cksum/zip) affichent les valeurs CRC en hexadécimal. Pour correspondre à ce format, utilisez %08X pour obtenir une chaîne hexadécimale de 8 chiffres avec zéros de remplissage :

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

Vérification de l'intégrité des données

L'utilisation réelle de CRC-32 est de détecter les changements. Vous calculez et stockez une somme de contrôle une fois, puis vous la recalculez plus tard et comparez — si les deux diffèrent, les données ont été modifiées. Voici un exemple autonome qui stocke une somme de contrôle, puis valide une copie par rapport à celle-ci :

<?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.";
}
?>

Ceci affiche OK: data is intact.. Pour vérifier un fichier réel, remplacez la chaîne par crc32(file_get_contents($filename)). Utilisez la comparaison stricte === pour que PHP compare à la fois la valeur et le type — et si votre somme de contrôle attendue arrive sous forme de chaîne hexadécimale depuis une source externe, convertissez-la d'abord avec (int) hexdec($expected_crc).

Notes importantes

  • Pas cryptographiquement sécurisé. CRC-32 est trivial à falsifier — un attaquant peut créer des données différentes avec la même somme de contrôle. Utilisez-le uniquement pour la détection d'erreurs accidentelles, jamais pour les mots de passe, signatures ou protection contre la falsification.
  • Les collisions arrivent. Avec seulement ~4,3 milliards de valeurs possibles, deux chaînes différentes peuvent partager une somme de contrôle. C'est acceptable pour détecter la corruption, mais pas pour identifier des données de manière unique.
  • Pour la sécurité ou l'adressage de contenu, utilisez un vrai hash. Tournez-vous vers md5(), sha1(), ou le moderne hash() (ex. SHA-256) — et md5_file() / sha1_file() pour les fichiers.

Résumé

crc32() est un moyen rapide de créer une empreinte d'une chaîne pour la détection d'erreurs accidentelles — vérifier les téléchargements, repérer les enregistrements corrompus ou effectuer des contrôles de cohérence des données en transit. N'oubliez pas de normaliser le résultat avec sprintf('%u', ...) pour une cohérence multiplateforme, et choisissez un hash cryptographique chaque fois que la sécurité est importante.

Pratique

Pratique
Quelle est la fonction de crc32() en PHP ?
Quelle est la fonction de crc32() en PHP ?
Was this page helpful?