Calcular CRC32 online

O CRC32 é um código de verificação de 32 bits, escrito com 8 caracteres hexadecimais, usado para detectar erros acidentais em dados, como em arquivos ZIP, imagens PNG e transmissões de rede. Esta ferramenta calcula o CRC32 de um texto ou arquivo no seu navegador, em hexadecimal, decimal ou Base64. Ele não serve para segurança.

Atualizado em · Por Leonardo Gaertner

CRC-32
-

Achou um resultado errado ou tem uma sugestão? Avise por e-mail.

Como usar

  1. Digite ou cole o texto, ou escolha um arquivo.
  2. O CRC32 aparece na hora. Escolha a saída: hexadecimal, decimal ou Base64.
  3. Clique em Copiar para levar o valor.

Como funciona

O CRC32 trata os bytes da entrada como um polinômio e calcula o resto da divisão por um polinômio fixo de 32 bits, o mesmo do padrão IEEE 802.3, usado no ZIP, no gzip, no PNG e na função crc32 do PHP e do zlib. O texto é convertido para UTF-8 antes do cálculo.

Ele detecta com certeza erros comuns de transmissão, como bits trocados e trechos curtos corrompidos, e é muito rápido. Mas é fácil criar de propósito dois conteúdos com o mesmo CRC32, então ele não protege contra adulteração: para isso, use SHA-256.

Existe também o CRC-32C (Castagnoli), usado no iSCSI, no ext4 e em serviços de nuvem, que usa outro polinômio e dá outro resultado. Esta ferramenta calcula o CRC-32 do padrão IEEE.

Exemplos de CRC32

123456789: cbf43926 (o valor de conferência do padrão)

Texto vazio: 00000000

abc: 352441c2

Fonte: RFC 1952: formato gzip, com o cálculo do CRC-32

Em código

Para calcular o CRC32 em código: Python e PHP já trazem a função pronta; em JavaScript, a tabela de 256 valores resolve em poucas linhas. Atenção ao nome no PHP: o CRC32 do ZIP é o crc32b.

JavaScript
// CRC-32 (IEEE), o mesmo do ZIP, do PNG e do gzip. No Node.js 22.2+ também há zlib.crc32().
const TABELA = Array.from({ length: 256 }, (_, n) => {
  let c = n;
  for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
  return c >>> 0;
});

function crc32(bytes) {
  let c = 0xffffffff;
  for (const b of bytes) c = TABELA[(c ^ b) & 0xff] ^ (c >>> 8);
  return ((c ^ 0xffffffff) >>> 0).toString(16).padStart(8, '0');
}

// crc32(new TextEncoder().encode('123456789')) === 'cbf43926'
Python
import zlib


def crc32_hex(dados: bytes) -> str:
    # zlib.crc32 devolve um número sem sinal no Python 3
    return f"{zlib.crc32(dados):08x}"


def crc32_arquivo(caminho: str) -> str:
    valor = 0
    with open(caminho, "rb") as f:
        for pedaco in iter(lambda: f.read(1024 * 1024), b""):
            valor = zlib.crc32(pedaco, valor)  # continua o cálculo do pedaço anterior
    return f"{valor:08x}"
PHP
<?php
function crc32Hex(string $dados): string
{
    // hash('crc32b') é o CRC-32 do ZIP; hash('crc32') é outra variante, com outro resultado
    return hash('crc32b', $dados);
}

function crc32Arquivo(string $caminho): string
{
    return hash_file('crc32b', $caminho);
}

Perguntas frequentes

Qual a diferença entre CRC32 e MD5 ou SHA-256?

O CRC32 é um código de verificação para erros acidentais, curto e muito rápido. MD5 e SHA-256 são funções de hash criptográficas, maiores e feitas para dificultar colisões; só o SHA-256 ainda é seguro para isso.

Por que o CRC32 do PHP dá um número e não hexadecimal?

A função crc32() do PHP devolve o valor como inteiro. É o mesmo CRC32 desta ferramenta na saída decimal. Para o hexadecimal, use hash("crc32b", $texto).

O CRC32 serve para conferir downloads?

Serve para detectar arquivos corrompidos por acidente, e é isso que o ZIP faz. Mas não prova que ninguém alterou o arquivo de propósito: para isso, compare o SHA-256 publicado pelo autor.

Por que meu CRC32 é diferente de outra ferramenta?

Pode ser outra variante (como CRC-32C ou o crc32 do PHP hash(), que não é o do ZIP), uma diferença invisível no texto, como uma quebra de linha no fim, ou a codificação do texto. Esta ferramenta usa o CRC-32 IEEE sobre o texto em UTF-8.