Если оставить в стороне соображения производительности и безопасности, и если предположить, что хеш-функция с идеальным лавинным эффектом, что я должен использовать для контрольной суммы блоков данных: CRC32 или хэш, усеченный до N байтов? Т.е. у которых будет меньшая вероятность пропустить ошибку? Конкретно:
- CRC32 против 4-байтового хеша
- CRC32 против 8-байтового хеша
- CRC64 против 8-байтового хеша
Блоки данных должны многократно передаваться по сети и сохраняться на диске. Блоки могут иметь размер от 1 КБ до 1 ГБ.
Насколько я понимаю, CRC32 может обнаруживать до 32-битных флипов со 100% надежностью, но после этого его надежность приближается к 1-2^(-32)
, а для некоторых паттернов намного хуже. Идеальная 4-байтовая надежность хеширования всегда равна 1-2^(-32)
, так что разберитесь.
8-байтовый хэш должен иметь гораздо лучшую общую надежность (2^(-64)
шанс пропустить ошибку), поэтому следует ли ему отдавать предпочтение перед CRC32? Что насчет CRC64?
Думаю, ответ зависит от типа ошибок, которых можно ожидать при такой операции. Скорее всего, мы увидим редкие 1-битные перевороты или массивные повреждения блоков? Кроме того, учитывая, что в большинстве систем хранения и сетевого оборудования реализована своего рода CRC, не следует ли уже позаботиться о случайном переключении битов?