IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Détection de cycle dans une fonction de hashage de taille réduite


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2021
    Messages : 28
    Par défaut Détection de cycle dans une fonction de hashage de taille réduite
    Bonsoir,

    J'ai réalisé un code en C utilisant une fonction de hashage (de taille réduite i.e. sortie sur un nombre de bits choisi) que l'on m'a fourni. Le code doit me permettre de détecter un cycle dans celle-ci (méthode de brent).

    Cependant, j'ai un bug dedans. Je pense que mon problème vient des malloc ou bien de mon itération sur la fonction de hashage (qui pointe en sortie sur un malloc).

    J'ai réalisé de nombreux tests en modifiant tout un tas de chose mais, étrangement, mon lambda (= la longueur de mon cycle) vaut, pour t=8, souvent 1 ou 13, ... Pour une valeur de t, on retrouve très souvent les mêmes longueurs de cycles ce qui parrait très étrange.

    Je vous mets mon code et la fonction de hashage + son prototype en PJ
    exemple.c
    md5_small.c
    Nom : Capture d’écran 2023-01-19 220727.png
Affichages : 123
Taille : 107,2 Ko


    Pouvez vous m'aider ?

    Merci par avance de votre retour

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonsoir
    Citation Envoyé par Chaka_Sobek Voir le message
    Je vous mets mon code et la fonction de hashage + son prototype en PJ
    Déjà, comme indiqué dans les règles, on poste les code dans le forum. D'une part ça évite d'imposer aux intervenants de télécharger des trucs sur leur dd et d'autre part, si plus tard un autre a le même souci, le code risque de ne plus être dispo.

    Citation Envoyé par Chaka_Sobek Voir le message
    Pouvez vous m'aider ?
    Immédiatement un gros souci avec cette instruction unsigned int taille_message=sizeof(m). Parce que d'une part le rôle de sizeof() n'est pas de donner la taille d'un tableau. En effet, si je change unsigned char m[] = "coucouaezrezrez" en unsigned char* m = "coucouaezrezrez" comme j'en ai le droit, sizeof() donne alors 8. Tu crées un tableau tu dois en permanence gérer toi-même sa taille, car aucun mécanisme en C ne peut te la récupérer.
    Et d'autre part, tu veux la longueur de m, pas sa taille (tu n'as pas vu que ça donnait 16 alors qu'il n'y a que 15 lettres???). Et la longueur d'une chaine s'obtient via strlen(). Et le retour n'est pas un unsigned int mais un size_t. Donc size_t taille_message=strlen(m).

    Et fatalement le souci de sizeof() arrive immédiatement ici avec unsigned char *hash = malloc(hash_byte_length*sizeof(*hash)) suivi ensuite d'un unsigned int input_byte_length=sizeof(hash) où tu obtiens input_byte_length=8 (taille d'une adresse car c'est exactement ce qu'est la variable "hash": une adresse). A partir de là, plus rien ne peut marcher.
    On n'utilise pas sizeof() pour pallier à son manque de rigueur!!!

    Accessoirement ce code...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (t%8 !=0){
    	hash_byte_length=t/8 +1;
    }
    else {
    	hash_byte_length=t/8;
    }
    ... n'est pas faux mais déjà tu aurais pu factoriser t/8 pour ne le faire qu'une fois (avant le "if" et rajouter ou pas "+1") et surtout un minimum de mathématiques associée à la connaissance des opérateurs du C te donnera cet équivalent hash_byte_length=(t-1)/8+1 (équivalent pour t > 0). Ceci dit, vu que t=8 en début de programme et ne change plus ensuite, la nécessité fondamentale de cette opération peut se discuter.

    Ah et dernier truc: on n'inclut jamais un ".c". Le compilateur est parfaitement capable d'associer plusieurs sources ensembles donc on utilise cette capacité et on code proprement (en créant les include qui vont bien si on a besoin, dans exemple.c, de référencer des trucs situés dans md5_small.c) puis on compile correctement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    gcc -c md5_small.c
    gcc -c exemple.c
    gcc md5_small.o exemple.o -o exemple
    (un Makefile pourra te faciliter la vie)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Recuperation de formulaire dans une fonction
    Par arsgunner dans le forum ASP
    Réponses: 5
    Dernier message: 23/06/2004, 15h04
  2. Transmission d'un objet crée dans une fonction
    Par EvilAngel dans le forum ASP
    Réponses: 2
    Dernier message: 10/05/2004, 20h19
  3. Utilisez MinimizeName() dans une fonction
    Par James_ dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/05/2004, 18h05
  4. [Postgresql]Connecter à une autre base dans une fonction
    Par alex2205 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/05/2003, 11h30
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo