W3docs

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): int

Accetta 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 string

Esempio di base

php— editable, runs on the server

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 è:

3964322768

Molti 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 moderno hash() (es. SHA-256) — e md5_file() / sha1_file() per i file.

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.

Pratica

Pratica
Qual è la funzione di crc32() in PHP?
Qual è la funzione di crc32() in PHP?
Was this page helpful?