Быстрый алгоритм CRC?

Я хочу создать 32-битное число из ASCII-строки. Алгоритм CRC32-это именно то, что я ищу, но я не могу использовать его, потому что таблица, которую он требует, слишком велика (это для встроенных систем, где ресурсы очень редки).

Итак: есть предложения по быстрому и тонкому алгоритму CRC? Не имеет значения, когда коллизии немного более вероятны, чем с оригинальным CRC32.

спасибо!

2 ответов


реализации CRC используют таблицы для скорости. Они не требуются.

вот короткий CRC32, используя либо полином Кастаньоли (тот же, что используется инструкцией Intel crc32), либо полином Ethernet (тот же, что используется в zip, gzip и т. д.).

#include <stddef.h>
#include <stdint.h>

/* CRC-32C (iSCSI) polynomial in reversed bit order. */
#define POLY 0x82f63b78

/* CRC-32 (Ethernet, ZIP, etc.) polynomial in reversed bit order. */
/* #define POLY 0xedb88320 */

uint32_t crc32c(uint32_t crc, const unsigned char *buf, size_t len)
{
    int k;

    crc = ~crc;
    while (len--) {
        crc ^= *buf++;
        for (k = 0; k < 8; k++)
            crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
    }
    return ~crc;
}

исходная crc значение должно быть равно нулю. Процедура может вызываться последовательно с кусками данных для обновления CRC. Вы можете развернуть внутренний цикл для скорости, хотя ваш компилятор может сделать в любом случае, это для тебя.


очевидно, что самая большая таблица поиска принесет лучшую производительность, но вы можете использовать любую (меньшую) таблицу для поиска 16,8 или 4bit.

таким образом, размеры таблицы для crc32:

16bit-lookup: 4*2^16=256k  
 8bit-lookup: 4*2^8=1k  
 4bit-lookup: 4*2^4=64byte  

таблица 4bit в четыре раза медленнее, чем таблица 16bit.
То, что вы должны использовать, зависит от ваших требований к скорости.

Как упоминает лука ране, это хорошая идея поместить таблицу во флэш-память, но на многих платформах недостаточно использовать const ключевое слово.
Чаще всего вам нужно поместить таблицу в раздел, помещенный во flash, изменив командный файл компоновщика.