Hash finder - calculateur de hash en c

Soyez le premier à donner votre avis sur cette source.

Vue 21 872 fois - Téléchargée 1 450 fois

Description

C'est mon premier véritable logiciel programmé en C, un calculateur simple de hash de fichiers.

Après de longues recherches, j'ai mis au point ce logiciel qui permet de calculer les hash :
CRC16 CRC32 CRC64 Adler32 ELF32 FNV32 FNV64 Gost-Hash HAVAL-3-4-5 MD2 MD4 (ed2k) MD5 RIPEMD128 RIPEMD160 SHA1 SHA256 SHA384 SHA512 et Tiger

En réalisant des tests et en comparant avec d'autres logiciels de hash, je me suis aperçu que ReHash donnait un CRC64 différent du mien, alors pour ceux qui voudraient calculer avec la méthode ReHash, j'ai ajouté celle-ci (décommentez la ligne #define ___ReHash_Code___ dans "main.h").

C'est la version 1.1.1 prête à compiler avec Dev-C++ et Code::Blocks !

Aperçu : http://ordiman85.free.fr/logiciels/index.php?page=shots

Source / Exemple :


/* Hash Finder v1.1.1.0
  Explications du fonctionnement */

// Dans main.c :

// Inclusion des variables globales et des librairies à compiler pour les calculs et autres...
#include "main.h"

// Fonction principale
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
 // Copie de la ligne de commande (facultative) dans la 'string' LigneCommande qui est utilisable dans tout le code
 // Ouverture de la fenêtre
 // Boucle des évènements et des messages
}

// Callback principal
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
 switch (uMsg) {
  case WM_CREATE:
   // Création des contrôles
   // Gestion de la ligne de commande
   // Si ligne de comande détectée, lance la fonction OuvertureFichier()
   return 0;
  case WM_COMMAND:
   // Détecte les évènements liés aux contrôles :
   // Si l'utilisateur appuie sur Parcourir, ça ouvre une mini-fenêtre de sélection
   // S'il appuie sur Calculer, ça lance la fonction OuvertureFichier()
   // Si le bouton Calculer était tranformé en bouton Annuler, termien simplement le calcul (lance AnnulerCalcul(1))
   // S'il appuie enfin sur la case à cocher Afficher en majuscules... lance Change_Majuscules();
   return 0;
  case WM_DROPFILES:
   // Le champ du nom de fichier est modifié en faisant un glisser-déposer
   return 0;
  case WM_DESTROY:
   PostQuitMessage(0); // Si la fenêtre est sur le point d'être détruite
   return 0;
  default:
   return DefWindowProc(hwnd, uMsg, wParam, lParam); // Réponse par déaut
  }
}

// Callback lancée par le timer Windows 
VOID CALLBACK ProgressProc(HWND hwnd, UINT uMsg, UINT_PTR Type, DWORD dwTime) {
 // Met à jour la barre de progression en arrière-plan
}

// Tout dans le titre...
char OuvertureFichier(char* Fichier) {
 // Vérifie l'existence du fichier
 // Si le fichier existe, l'ouvre et lance InitHash
 // Sinon affiche une box d'erreur
}

// Initialisation du calcul
void InitHash() {
 // Met les contextes hash à zéro
 // Modifie le texte des contrôles (Calculer devient Annuler...)
 // Lance le timer Windows pour éxécuter ProgressProc();
 // Lance le thread HashProc();
}

// Fonction de calcul
void HashProc() {
 // Effectue les opérations propres à chaque hash (boucle -> lecture fichier -> MAJ calcul -> et hop ça repart!)
 // Une fois la lecture finie, lance FinalHash();
 // A là fin lance AnnulerCalcul(0) pas pour annuler mais pour remettre les contrôles comme à l'initial
}

// Finalisation du calcul
void FinalHash() {
 // Effectue des manips propres à chaque hash (switch)
 // Place le hash en hexadécimal dans le variable globale
 // Lance AnnulerCalcul(0);
 // Met à jour le champ textuel du hash en lançant Change_Majuscules();
}

// RAZ des contrôles
void Annuler_Calcul(char Annuler) {
 // Si Annuler == 1, affiche "opération annulée"
 // Sinon, rien
 // Et enfin RAZ des contrôles, fin du timer, fermeture du fichier si ouvert.
}

// MAJ du champ du hash
void Change_Majuscules() {
 // Et en majuscules à l'occasion si l'utilisateur l'a choisi
}

Conclusion :


J'ai été étonné que la barre de progression se soit affichée en utilisant CreateWindow() alors que je n'ai mis aucun '#include <commctrl.h>' et aucun InitCommonCtrl ou un truc du genre, alors qu'en faisant une appli toute simple avec une barre de progression dans une petite fenêtre, pas moyen de l'afficher !!

Je voudrais demander aux programmeurs expérimentés si un Sleep() est nécéssaire...

La dernière version sera toujours ici :
http://ordiman85.free.fr/logiciels/index.php?page=download

@+

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Utilisateur anonyme
Comment fais tu pour calculer le CRC32 d'un gros fichier (plus de 300Mo) car j'ai éssayé de reprendre tes sources mais mon niveau est trés loin du tien ^^.
J'ai besoin d'un coup de mains

Ma question plus en détail ici : http://www.cppfrance.com/forum/sujet-LIRE-GROS-FICHIER-CRC32_1416868.aspx#1
Messages postés
41
Date d'inscription
samedi 4 mars 2006
Statut
Membre
Dernière intervention
19 mars 2010

Effectivement, lorsque je suis passé sous vista, j'ai remarqué que mon logiciel crashait à la fin. Je n'ai pas cherché de solution, à mon avis ça doit venir soit de l'utilisation d'une fonction n'existant plus sous Vista, soit d'une mauvaise gestion des threads.
J'ai commencé un version multi-plateforme en C++ qui elle, n'a pas ce problème.

http://www.cppfrance.com/codes/CPLUSPLUS-HASH-FINDER-CALCULATEUR-HASH_48950.aspx
Messages postés
3
Date d'inscription
vendredi 7 janvier 2005
Statut
Membre
Dernière intervention
10 avril 2009

Je suis sous Windows Vista, je l'ai compilé avec Dev C++ 4.9.9.2
Il s'exécute sans probleme, par contre dés que je veux trouver un hash il crash systématiquement. Peut importe le type de fichier et peut importe le type de hash.

Une idée ? :)

Merci.
Messages postés
41
Date d'inscription
samedi 4 mars 2006
Statut
Membre
Dernière intervention
19 mars 2010

Merci pour tout.
Actuellement je développe une version multi-plateforme et C++ de ce programme.

La partie graphique sera gérée par FLTK, une librairie extrêmement légère (environ 300 ko).
La partie calculatoire est encapsulée dans des classes C++ abstraites puis réelles, grâce au polymorphisme.
Le projet est déjà fonctionnel et peut calculer le MD5, CRC16, CRC32, CRC64. Son éxécutable pèse environ 521 ko, ce qui n'est pas excessif pour un logiciel avec peu de fonctionnalités.

Je l'ajouterai sans écraser cette source-ci qui est une version C qui fonctionne totalement différement.

Cordialement, Charly Isidore
Messages postés
1
Date d'inscription
lundi 1 octobre 2007
Statut
Membre
Dernière intervention
1 janvier 2009

Excellent travail !
tes sources me seront très utile !
Ce programme est très bien structuré donc je crois que tu n'auras pas de mal à le mettre a jour ^^

Bravo !
Afficher les 10 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.