W3docs

crc32()

La función crc32() calcula el checksum de redundancia cíclica de una cadena y devuelve un entero de 32 bits.

La función PHP crc32() calcula el CRC-32 (Comprobación de Redundancia Cíclica) de una cadena y lo devuelve como un entero de 32 bits. CRC-32 es un checksum rápido y ligero: convierte cualquier cadena en una huella corta, de modo que más adelante puedes detectar si los datos han cambiado (corrupción accidental durante una descarga, un error de disco, un bit invertido). Es una herramienta de detección, no una herramienta de seguridad — consulta las notas a continuación.

Esta página cubre la sintaxis, el problema de los valores con signo/sin signo que confunde a la mayoría de las personas, un ejemplo ejecutable, una verificación de integridad realista y cuándo usar un hash real en su lugar.

Syntax

crc32(string $string): int

Acepta un único parámetro — el $string a analizar — y devuelve el checksum CRC-32 como un entero.

El problema de con signo vs. sin signo

CRC-32 es conceptualmente un valor de 32 bits sin signo (de 0 a 4.294.967.295). En plataformas de 64 bits, PHP lo devuelve como un entero positivo normal. En plataformas de 32 bits, los valores superiores a 2.147.483.647 se desbordan y regresan como negativos. Para obtener el mismo valor sin signo en todas partes, formatealo con %u:

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

Basic example

php— editable, runs on the server

Pasamos la cadena a crc32() y la envolvemos en sprintf('%u', ...) para que el resultado sea consistente en todas las plataformas. La salida de este código es:

3964322768

Muchas herramientas (y el mundo de cksum/zip) muestran los valores CRC en hexadecimal. Para igualar ese formato, usa %08X para obtener una cadena hexadecimal de 8 dígitos con relleno de ceros:

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

Verifying data integrity

El uso real de CRC-32 es detectar cambios. Calculas y almacenas un checksum una vez, luego lo recalculas más tarde y lo comparas — si los dos difieren, los datos fueron alterados. Aquí hay un ejemplo autocontenido que almacena un checksum y luego valida una copia contra él:

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

Esto imprime OK: data is intact.. Para verificar un archivo real, reemplaza la cadena por crc32(file_get_contents($filename)). Usa la comparación estricta === para que PHP compare tanto el valor como el tipo — y si tu checksum esperado llega como una cadena hexadecimal desde una fuente externa, conviértelo primero con (int) hexdec($expected_crc).

Important notes

  • No es criptográficamente seguro. CRC-32 es trivial de falsificar — un atacante puede crear datos diferentes con el mismo checksum. Úsalo solo para detectar errores accidentales, nunca para contraseñas, firmas o protección contra manipulaciones.
  • Las colisiones ocurren. Con solo ~4.300 millones de valores posibles, dos cadenas diferentes pueden compartir un checksum. Esto está bien para detectar corrupción, pero no para identificar datos de forma única.
  • Para seguridad o direccionamiento de contenido, usa un hash real. Recurre a md5(), sha1(), o el moderno hash() (p. ej., SHA-256) — y md5_file() / sha1_file() para archivos.

Summary

crc32() es una forma rápida de obtener una huella digital de una cadena para detectar errores accidentales — verificar descargas, detectar registros corruptos o comprobar datos en tránsito. Recuerda normalizar el resultado con sprintf('%u', ...) para consistencia entre plataformas, y elige un hash criptográfico siempre que la seguridad importe.

Practice

Práctica
¿Cuál es la función de crc32() en PHP?
¿Cuál es la función de crc32() en PHP?
Was this page helpful?