@Vovasab

Как посчитать контрольную сумму файла и правильно ли я сделал?

На вход программы подается файл, нужно посчитать контрольную сумму файла. Я написал код, но не знаю так ли оно работает
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>

int hash(int, char);
void first_task(void);

int main()
{

    first_task();

    return 0;
}

void first_task()
{
    FILE *fp;
    if((fp = fopen("test.txt", "rb+")) == NULL)
    {
        fprintf(stderr,"Cannot open test.txt");
        return -1;
    }

    int hash1 = 3;
    char c;

    fread(&c, 1, 1, fp);
    while((c = fgetc(fp)) != EOF)
    {
        putchar(c);
        hash1 = hash(hash1, c);
    }
    printf("File checksum: %d", hash1);
}

int hash(int hash0, char byte)
{
    return 41*hash0*byte;
}
  • Вопрос задан
  • 90 просмотров
Решения вопроса 2
zagayevskiy
@zagayevskiy
Android developer at Yandex
В простейшем виде, конечно, да, как-то это работать будет. Но количество коллизий на простейших данных будет просто чудовищное. Абсолютно неустойчиво к перестановкам, например. "abc", "acb" и "bca" дадут одинаковые суммы.

Можно взять, ну хотя бы CRC. Реализовать просто, и хоть ну какой-то минимальный смысл есть.
Ответ написан
@vanyamba-electronics
Примерно так
unsigned int calc_hash(const unsigned char* s, unsigned int len)
{
    char ch = 0;
    unsigned int result = 0;
    unsigned int n = 0;
    for ( ; n != len; ++n) {
        result ^= (s[n] - ch) << (n % 3) * 8;
        ch = s[n];
        if (result & 0x800000) {
            result <<= 1;
            result |= 1;
        }
        else
            result <<= 1;
    }
    result &= 0xFFFFFF;
    result |= (n % 256) << 24;
    return result;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы