crc32()
La funzione crc32() calcola il checksum CRC-32 di una stringa e lo restituisce come intero a 32 bit.
La funzione PHP crc32() calcola il CRC-32 (Cyclic Redundancy Check) di una stringa e lo restituisce come intero a 32 bit. CRC-32 è un checksum rapido e leggero: trasforma qualsiasi stringa in una breve impronta digitale, così è possibile rilevare in seguito se i dati sono cambiati (corruzione accidentale durante un download, un errore su disco, un bit invertito). È uno strumento di rilevamento, non uno strumento di sicurezza — consulta le note seguenti.
Questa pagina descrive la sintassi, il problema dei valori con/senza segno che crea confusione alla maggior parte degli sviluppatori, un esempio eseguibile, un controllo di integrità realistico e quando conviene usare un vero hash.
Sintassi
crc32(string $string): intAccetta un singolo parametro — la $string da analizzare — e restituisce il checksum CRC-32 come intero.
Il problema dei valori con e senza segno
CRC-32 è concettualmente un valore senza segno a 32 bit (da 0 a 4.294.967.295). Sulle piattaforme a 64 bit PHP lo restituisce come un normale intero positivo. Sulle piattaforme a 32 bit, i valori superiori a 2.147.483.647 scorrono e tornano negativi. Per ottenere lo stesso valore senza segno su tutte le piattaforme, formattalo con %u:
$unsigned = sprintf('%u', crc32($str)); // always positive, as a stringEsempio di base
Passiamo la stringa a crc32() e la avvolgiamo in sprintf('%u', ...) in modo che il risultato sia coerente su ogni piattaforma. L'output di questo codice è:
3964322768Molti strumenti (e il mondo cksum/zip) visualizzano i valori CRC in formato esadecimale. Per ottenere lo stesso formato, usa %08X per una stringa esadecimale a 8 cifre con zero iniziali:
<?php
echo sprintf('%08X', crc32("Hello, World!")); // EC4AC3D0
?>Verifica dell'integrità dei dati
L'uso reale di CRC-32 è rilevare le modifiche. Si calcola e memorizza un checksum una volta, poi lo si ricalcola in seguito e si confronta — se i due differiscono, i dati sono stati alterati. Ecco un esempio autonomo che memorizza un checksum e poi convalida una copia rispetto ad esso:
<?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.";
}
?>Questo stampa OK: data is intact.. Per verificare un file reale, sostituisci la stringa con crc32(file_get_contents($filename)). Usa il confronto rigoroso === in modo che PHP confronti sia il valore che il tipo — e se il checksum atteso arriva come stringa esadecimale da una fonte esterna, convertila prima con (int) hexdec($expected_crc).
Note importanti
- Non è crittograficamente sicuro. CRC-32 è banale da falsificare — un aggressore può creare dati diversi con lo stesso checksum. Usalo solo per il rilevamento di errori accidentali, mai per password, firme o protezione contro manomissioni.
- Le collisioni accadono. Con soli ~4,3 miliardi di valori possibili, due stringhe diverse possono condividere un checksum. Questo va bene per rilevare la corruzione, ma non per identificare univocamente i dati.
- Per la sicurezza o l'indirizzamento dei contenuti, usa un vero hash. Usa
md5(),sha1(), o il modernohash()(es. SHA-256) — emd5_file()/sha1_file()per i file.
Riepilogo
crc32() è un modo rapido per ottenere un'impronta digitale di una stringa per il rilevamento di errori accidentali — verifica dei download, individuazione di record corrotti o controllo di integrità dei dati in transito. Ricorda di normalizzare il risultato con sprintf('%u', ...) per la coerenza multipiattaforma, e scegli un hash crittografico ogni volta che la sicurezza è importante.