2010-08-12 4 views
4

Comment puis-je faire une somme de contrôle d'un fichier en utilisant C? Je ne veux pas utiliser un tiers, par défaut juste c langue et aussi la vitesse est très importante (ses moins les fichiers 50 Mo mais de toute façon)Somme de contrôle du fichier C

grâce

+0

Existe-t-il un algorithme de somme de contrôle/hachage particulier qui vous intéresse? –

+0

le "rapide et simple", s'il y en a ..Je veux juste avoir "vrai" à un booléen si le test est bon – Checksummmmm

+0

Toute somme de contrôle est beaucoup plus rapide que l'E/S du disque, donc cela n'a pas vraiment d'importance. Vous devez décider ce que vous voulez ici. Si vous voulez un hachage cryptographique, c'est un peu différent de CRC32 ou Murmur. –

Répondre

8
  1. Déterminez quel algorithme vous voulez utiliser (CRC32 est un exemple)
  2. Cherchez l'algorithme sur Wikipedia ou une autre source
  3. écrire du code pour mettre en œuvre cet algorithme
  4. des questions post ici si/quand le code n'implémente pas correctement l'algorithme
  5. Profit?
+1

+1 juste pour "Profit?" –

10

je suggère à commencer par le simple, un et seulement se soucier de l'introduction de l'exigence rapide si elle se révèle être un problème.

Trop de temps est gaspillé pour résoudre des problèmes qui n'existent pas (voir YAGNI). Par simple, je veux dire simplement commencer un caractère de somme (tous les caractères sont non signés) à zéro, lire chaque caractère et le soustraire du caractère de somme de contrôle jusqu'à la fin du fichier, en supposant que votre implémentation s'emballe intelligemment.

Quelque chose comme dans le programme suivant:

#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; 
} 

qui sort:

Checksum is 0x0c 
Checksum test is 0x00 

Cette checksum fonction ne fait les deux emplois. Si vous lui passez un bloc de données sans somme de contrôle à la fin, il vous donnera la somme de contrôle. Si vous lui passez un bloc avec la somme de contrôle à la fin, il vous donnera zéro pour une bonne somme de contrôle, ou non-zéro si la somme de contrôle est mauvaise.

Cette approche est la plus simple et permet de détecter la plupart des erreurs aléatoires. Il ne détectera pas les cas de contour comme deux caractères échangés, donc, si vous avez besoin de plus de véracité, utilisez quelque chose comme Fletcher ou Adler.

Ces deux pages Wikipedia ont un code C que vous pouvez utiliser tel quel ou analyser et recoder pour éviter les problèmes d'IP si vous êtes concerné.

+0

-1 il existe de bien meilleures fonctions de hachage qui sont toujours simples. http://www.cse.yorku.ca/~oz/hash.html – u0b34a0f6ae

+2

@Kaizer, cela n'a rien à voir avec la simplicité. Ces fonctions dans ce lien que vous fournissez sont des fonctions _hash_ et leur but est totalement différent de checksumming - leur intention est de maximiser l'équilibre entre les paniers pour la distribution de clés, pas simplement obtenir une indication d'un fichier "valeur" pour vérifier (ils peuvent être _used_ pour cela, mais ils ne fournissent aucun avantage dans ce cas). En outre, ils effectuent tous des opérations plus complexes que la simple addition et, pour citer la question, "la vitesse est très importante". – paxdiablo

+0

simplement ajouter tous les caractères est la somme de contrôle la plus simple possible, bien sûr, mais elle ne protège pas contre les échanges comme "Holle_" '. – u0b34a0f6ae

2

simple et rapide

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

fclose(fp) 
3

En général, CRC32 avec un bon polynôme est probablement votre meilleur choix pour une somme de contrôle-hachage cryptographique non. Voir ici pour quelques raisons: http://guru.multimedia.cx/crc32-vs-adler32/ Cliquez sur la catégorie de correction d'erreur sur le côté droit pour obtenir beaucoup plus de messages liés à crc.