Контрольная сумма файла C - PullRequest
3 голосов
/ 12 августа 2010

как я могу сделать контрольную сумму файла, используя C?я не хочу использовать какую-либо третью сторону, просто очень важен язык по умолчанию, а также скорость (меньше файлов 50 Мб, но в любом случае)

спасибо

Ответы [ 5 ]

9 голосов
/ 12 августа 2010

Я бы предложил начать с simple , а затем беспокоиться только о введении требования fast , если оно окажется проблемой.

Слишком многовремя потрачено на решение проблем, которые не существуют (см. YAGNI).

Под простым я подразумеваю просто начинать символ контрольной суммы (все символы здесь без знака) с нуля, читая каждый символ и вычитая егоот символа контрольной суммы до достижения конца файла, при условии, что ваша реализация разумно переносится.

Что-то похожее на следующую программу:

#include <stdio.h>

unsigned char checksum (unsigned char *ptr, size_t sz) {
    unsigned char chk = 0;
    while (sz-- != 0)
        chk -= *ptr++;
    return chk;
}

int main(int argc, char* argv[])
{
    unsigned char x[] = "Hello_";
    unsigned char y = checksum (x, 5);
    printf ("Checksum is 0x%02x\n", y);
    x[5] = y;
    y = checksum (x, 6);
    printf ("Checksum test is 0x%02x\n", y);
    return 0;
}

, которая выводит:

Checksum is 0x0c
Checksum test is 0x00

Эта функция checksum фактически выполняет обе работы.Если вы передадите ему блок данных без контрольной суммы в конце, он даст вам контрольную сумму.Если вы передадите ему блок с контрольной суммой в конце, он даст вам ноль для хорошей контрольной суммы или ненулевой, если контрольная сумма неверна.

Это самый простой подход, который обнаружит большинство случайных ошибок.,Он не будет обнаруживать крайние случаи, как два замененных символа, поэтому, если вам нужна даже больше достоверность, используйте что-то вроде Fletcher или Adler .

На обеих этих страницах Википедии есть пример кода C, который вы можете использовать как есть, либо анализировать и перекодировать, чтобы избежать проблем с IP, если вас это беспокоит.

8 голосов
/ 12 августа 2010
  1. Определите, какой алгоритм вы хотите использовать (пример CRC32)
  2. Посмотрите алгоритм в Википедии или другом источнике
  3. Напишите код для реализации этого алгоритма
  4. Пишите здесь вопросы, если / когда код неправильно реализует алгоритм
  5. Прибыль
3 голосов
/ 12 августа 2010

Просто и быстро

FILE *fp = fopen("yourfile","rb");
unsigned char checksum = 0;
while (!feof(fp) && !ferror(fp)) {
   checksum ^= fgetc(fp);
}

fclose(fp)
2 голосов
/ 12 августа 2010

Как правило, CRC32 с хорошим полиномом, вероятно, является вашим лучшим выбором для контрольной суммы без криптографической хеш-функции.См. Здесь по некоторым причинам: http://guru.multimedia.cx/crc32-vs-adler32/ Нажмите на категорию для исправления ошибок справа, чтобы получить намного больше сообщений, связанных с crc.

0 голосов
/ 12 августа 2010

Я бы рекомендовал использовать реализацию BSD. Например, http://www.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/cksum/

...