Как пользоваться
- Введите или вставьте текст, переключите формат ввода на «Hex» для необработанных байтов или откройте файл, чтобы вычислить контрольную сумму его содержимого.
- Оставьте в параметре «Алгоритм» значение CRC-32 для архивов ZIP и gzip и изображений PNG или выберите CRC-32C для iSCSI, файловых систем ext4 и Btrfs и облачного хранилища Google Cloud Storage.
- Выберите формат вывода: «hex (нижний регистр)», «HEX (верхний регистр)», «Десятичный» или «Base64».
- Для проверки вставьте ожидаемую контрольную сумму в поле «Сравнить с» — в hex без 0x, в десятичном виде или в Base64.
Что такое контрольная сумма CRC32
Циклический избыточный код (CRC) рассматривает входные данные как один длинный двоичный многочлен, делит его на фиксированный порождающий многочлен и сохраняет остаток. У CRC-32 остаток занимает 32 бита и обычно записывается 8 шестнадцатеричными цифрами или беззнаковым числом от 0 до 4 294 967 295. Практически любое изменение данных меняет остаток.
CRC рассчитаны на ошибки, которые возникают в реальных кабелях, радиоканалах и дисках. CRC-32 обнаруживает любую пакетную ошибку длиной до 32 бит, а случайное повреждение остаётся незамеченным лишь примерно в одном случае из 4,3 миллиарда. Кроме того, CRC-32 очень быстро вычисляется, поэтому он встроен в ZIP, gzip, PNG и кадры Ethernet.
CRC-32 и CRC-32C
| CRC-32 | CRC-32C (Castagnoli) | |
|---|---|---|
| Многочлен | 0x04C11DB7, в отражённой форме 0xEDB88320 | 0x1EDC6F41, в отражённой форме 0x82F63B78 |
Контрольное значение для 123456789 | cbf43926 | e3069283 |
| Где используется | ZIP, gzip, PNG, Ethernet | iSCSI, SCTP, метаданные ext4, Btrfs, Google Cloud Storage |
| Аппаратная поддержка | Инструкции CRC32 в ARMv8 | Инструкция x86 SSE4.2 crc32, ARMv8 |
Оба алгоритма начинают с 0xFFFFFFFF, обрабатывают биты каждого байта начиная с младшего и инвертируют итоговое значение; различается только многочлен, поэтому одни и те же данные дают два никак не связанных результата. Первый вариант — это то, что большинство инструментов называет «CRC32»; в каталогах он значится как CRC-32/ISO-HDLC. CRC-32C позже приняли протоколы хранения данных и сетевые протоколы за более надёжное обнаружение ошибок. Google Cloud Storage сообщает CRC-32C, а Amazon S3 — любой из двух вариантов; оба сервиса записывают значение как Base64 от четырёх байтов в порядке big-endian, и именно это показывает вывод в формате Base64.
Контрольная сумма, а не проверка безопасности
CRC защищает от случайностей, а не от атак. Это линейная функция, поэтому любой может изменить файл, а затем подогнать четыре байта так, чтобы его CRC-32 остался прежним. Значит, совпадение CRC ничего не говорит о преднамеренной подмене. Чтобы проверить скачанный файл, сравните хеш SHA-256 из доверенного источника; чтобы подтвердить, кто отправил сообщение, используйте HMAC.
Кроме того, 32 бита — слишком мало для идентификации данных. Уже среди примерно 77 000 случайных файлов вероятность того, что у каких-то двух совпадёт CRC-32, достигает 50%, поэтому не используйте его как уникальный идентификатор или ключ дедупликации. Там, где злоумышленника нет, гораздо лучшими отпечатками будут MD5 или SHA-256.
CRC32 в коде
# Python: в Python 3 zlib.crc32 возвращает беззнаковое число;
# "& 0xffffffff" нужен только в Python 2
import zlib
format(zlib.crc32(b'123456789'), '08x') # 'cbf43926'
// Node.js 20.15+ и 22.2+
require('zlib').crc32('123456789').toString(16).padStart(8, '0') // 'cbf43926'
// Go (import "hash/crc32")
crc32.ChecksumIEEE(data) // CRC-32
crc32.Checksum(data, crc32.MakeTable(crc32.Castagnoli)) // CRC-32C
// Java: java.util.zip.CRC32, а начиная с Java 9 и java.util.zip.CRC32C
// PHP
sprintf('%08x', crc32('123456789')); // 'cbf43926'
hash('crc32b', '123456789'); // 'cbf43926', тот же CRC-32
hash('crc32c', '123456789'); // 'e3069283'
hash('crc32', '123456789'); // '181989fc', другой CRC
Будьте внимательны с названиями в PHP: алгоритм хеширования crc32 — это не контрольная сумма ZIP, а CRC из bzip2, выводимый в обратном порядке байтов. Чтобы получить тот же результат, что в ZIP, gzip и этом инструменте, используйте crc32b или функцию crc32(). Команда Unix cksum использует ещё один вариант, который вдобавок учитывает длину файла, поэтому её число не совпадёт ни с одним из них.
Примеры
| Исходные данные (UTF-8) | CRC-32 |
|---|---|
Hello, World! | ec4ac3d0 |
Base64.is | 915d7207 |
你好 | 50a2b841 |
Часто задаваемые вопросы
Чему равен CRC32 строки «123456789»?
cbf43926 (3421780262 в десятичном виде), а CRC-32C — e3069283. Если ваша реализация возвращает эти значения, она использует те же параметры, что и этот инструмент.Почему мой CRC32 отличается от результата другого инструмента?
cksum дают разные результаты), входные байты (окончания строк, перевод строки в конце, кодировка текста), формат числа (некоторые языки возвращают знаковое 32-битное целое, из-за чего большие значения становятся отрицательными) и порядок байтов.Почему байты CRC в моём файле ZIP или gzip идут в обратном порядке?
unzip -v и большинство других программ выводят старший байт первым.Можно ли вычислить CRC32 большого файла?
Да. Нажмите «Открыть файл», и контрольная сумма будет вычислена по байтам файла на вашем устройстве без загрузки на сервер; подойдёт любой файл, который браузер может удержать в памяти. Затем результат можно сравнить со значением из файла SFV или из списка содержимого ZIP-архива.
Является ли CRC32 хеш-функцией?
Он отображает данные любой длины в фиксированное 32-битное значение, поэтому его часто перечисляют вместе с хешами, но это контрольная сумма: она обнаруживает случайные ошибки и никак не защищает от того, кто меняет данные намеренно. Если нужен более надёжный отпечаток, таблица «Все алгоритмы» под результатом показывает MD5 и семейство SHA для тех же входных данных.