crc32()
A função crc32() calcula um checksum de redundância cíclica de uma string e retorna um inteiro de 32 bits.
A função PHP crc32() calcula o CRC-32 (Verificação de Redundância Cíclica) de uma string e o retorna como um inteiro de 32 bits. O CRC-32 é um checksum rápido e leve: transforma qualquer string em uma impressão digital curta, permitindo detectar se os dados foram alterados (corrupção acidental durante um download, erro de disco, bit invertido). É uma ferramenta de detecção, não de segurança — veja as notas abaixo.
Esta página aborda a sintaxe, a armadilha signed/unsigned que confunde a maioria das pessoas, um exemplo executável, uma verificação de integridade realista e quando usar um hash de verdade.
Syntax
crc32(string $string): intRecebe um único parâmetro — a $string a ser analisada — e retorna o checksum CRC-32 como um inteiro.
A armadilha signed vs. unsigned
O CRC-32 é conceitualmente um valor de 32 bits sem sinal (0 a 4.294.967.295). Em plataformas de 64 bits, o PHP o retorna como um inteiro positivo normal. Em plataformas de 32 bits, valores acima de 2.147.483.647 ficam negativos devido ao overflow. Para obter o mesmo valor sem sinal em qualquer plataforma, formate com %u:
$unsigned = sprintf('%u', crc32($str)); // always positive, as a stringBasic example
Passamos a string para crc32() e a envolvemos com sprintf('%u', ...) para que o resultado seja consistente em todas as plataformas. A saída deste código é:
3964322768Muitas ferramentas (e o mundo do cksum/zip) exibem valores CRC em hexadecimal. Para isso, formate com %08X para obter uma string hexadecimal de 8 dígitos com zeros à esquerda:
<?php
echo sprintf('%08X', crc32("Hello, World!")); // EC4AC3D0
?>Verifying data integrity
O uso real do CRC-32 é detectar mudanças. Você calcula e armazena um checksum uma vez, depois o recalcula e compara — se os dois diferirem, os dados foram alterados. Aqui está um exemplo autocontido que armazena um checksum e depois valida uma cópia contra ele:
<?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.";
}
?>Isso imprime OK: data is intact.. Para verificar um arquivo real, substitua a string por crc32(file_get_contents($filename)). Use a comparação estrita === para que o PHP compare tanto o valor quanto o tipo — e se o checksum esperado chegar como uma string hexadecimal de uma fonte externa, converta-a primeiro com (int) hexdec($expected_crc).
Important notes
- Não é criptograficamente seguro. O CRC-32 é trivial de falsificar — um atacante pode criar dados diferentes com o mesmo checksum. Use-o apenas para detecção de erros acidentais, nunca para senhas, assinaturas ou proteção contra adulterações.
- Colisões acontecem. Com apenas ~4,3 bilhões de valores possíveis, duas strings diferentes podem ter o mesmo checksum. Isso é aceitável para detectar corrupção, mas não para identificar dados de forma única.
- Para segurança ou endereçamento de conteúdo, use um hash de verdade. Recorra a
md5(),sha1()ou ao modernohash()(ex.: SHA-256) — emd5_file()/sha1_file()para arquivos.
Summary
crc32() é uma forma rápida de criar uma impressão digital de uma string para detecção de erros acidentais — verificando downloads, identificando registros corrompidos ou fazendo verificações de sanidade de dados em trânsito. Lembre-se de normalizar o resultado com sprintf('%u', ...) para consistência entre plataformas, e escolha um hash criptográfico sempre que a segurança for importante.