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 :

fonction de hachage performante


Sujet :

C

  1. #1
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut fonction de hachage performante
    bonsoir à tous,
    j'ai besoin d'une fonction de hachage performante afin de stocker les mots dans la table de hachage.
    le probleme c'est que j'ai trouvé dans un forum une fonction de hachage exemple, je l'ai implémenté mais j'ai decouvert qu'il ya 2 mots qui ont la meme clé de ahchage ce qui à cuasé des collision.
    qu'uelqu'un peut m'aider svp.
    j'attend vos reponse.
    voila la fonction de hachage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    unsigned int HashCode (char  *ligne)
    {
       unsigned int Code = 0;
       size_t const len = strlen (ligne);
       size_t i;
     
     //  printf ("ligne = '%s'\n", ligne);
     
       for (i = 0; i < len; i++)
       {
          Code = ligne[i] + 31 * Code;
       }
       return Code % 101;
    }
    merci j'attends vos reponses.
    Le jour est le père du labeur et la nuit est la mère des pensées.

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    1/ il y aura toujours des collisions
    2/ elles sont plus probables que tu ne le penses, meme en considerant une fonction de hachage parfaite (cf le paradoxe des anniversaires)
    3/ la plupart des donnees ne sont pas equalement distribuees, donc on peut se servir de ce biais pour adapter la fonction de hachage aux donnees
    4/ On trouve facilement sur internet des fonctions et des articles analysant diverses fonctions et montrant que celle de l'auteur est la meilleure... (en cadeau: http://www.azillionmonkeys.com/qed/hash.html, http://isthe.com/chongo/tech/comp/fnv, http://burtleburtle.net/bob/hash/doobs.html, http://bretm.home.comcast.net/~bretm/hash/2.html)
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 89
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    1/ il y aura toujours des collisions
    2/ elles sont plus probables que tu ne le penses, meme en considerant une fonction de hachage parfaite (cf le paradoxe des anniversaires)
    Je crois pas. En effet il y aura toujours des collisions, mais dans les faits, c'est très rare voir impossible, avec une bonne fonction de hachage (surtout si ce sont des mots qui ont un sens).

    Mais là, je parle du hash code. Et lui, il parle de l'entrée dans la table de hachage. Sa table a une taille de 31 (cf le modulo 31), donc en effet il y aura toujours des collisions. Et dans une table de hachage, c'est normal.
    Faudrait calculer la probabilité, le paradoxe des anniversaires dit juste que ce n'est pas 1/31, mais ça reste dans cet ordre de grandeur.

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Meme avec des tables presque vides, il y a une probabilite non negligeable de collisions (plus de 50% pour une table de 365 entrees a partir de 23elements, donc un taux de remplissage de moins de 10%).

    En pratique, ou ta table est tres largement sur-dimensionnée, ou le risque de collision est non negligeable ou tes donnees n'ont pas une distribution uniforme et ta fonction de hachage en profite.

    Une petite table donnant pour differentes tailles le nombre d'elements qu'il faut pour avoir une probabilite de 50 et 90% de collision:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        10      5      7
        20      6     10
        50      9     15
       100     13     22
       200     17     31
       500     27     48
      1000     38     68
      2000     53     96
      5000     84    152
     10000    119    215
     20000    167    304
     50000    264    480
    100000    373    679
    200000    527    960
    500000    833   1518
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    salut,
    ban voilà c'est la fonction où je plante dont j'espere trouver une solution
    j'ai une table de hachage qui contietndes mots et leurs liste de coordonees:
    chaque mot a sa propre liste de coordonnées (num-ligne, position)

    bonjour(1,2)(2,4)
    les (1,3)(2,5)(4,6)
    amis (2,6)(3,5)(4,7)
    je dois generer à partir de cette table de hachage des liste de 2 mots en faisant la jointure des mots de la table de hachage: on joint les mot qui ont le meme num-ligne et que la position du dernier mot>position du 1er mot:
    par exemple on trouve là:
    bonjour les (1,3)(2,5)
    bonjour amis(2,6)
    les amis(2,6)(4,7)
    bon là j'arrive à faire cela , MAIS mon directeur ma dit qu'il faut faire un test sur les position
    Si les position de 2 mots sont successif en moin 2 fois on met les 2 mots dans la meme cellule par exemple là "bonjour les "dans la meme cellule car (1,2)(1,3)(2,4)(2,5)
    donc comme resumé j'arrive pas comment faire ce test là
    c'est troooooooop compliqué pour moi
    Le jour est le père du labeur et la nuit est la mère des pensées.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par cyrine Voir le message
    bonjour les (1,3)(2,5)
    bonjour amis(2,6)
    les amis(2,6)(4,7)
    bon là j'arrive à faire cela , MAIS mon directeur ma dit qu'il faut faire un test sur les position
    Si les position de 2 mots sont successif en moin 2 fois on met les 2 mots dans la meme cellule par exemple là "bonjour les "dans la meme cellule car (1,2)(1,3)(2,4)(2,5)
    donc comme resumé j'arrive pas comment faire ce test là
    c'est troooooooop compliqué pour moi
    Salut,

    Si j'ai bien tout compris, tu aurais besoin qu'on concatène des mots si :
    - 2 mots se suivent au moins 2 fois

    Je suppose que tu dois avoir une fonction qui parcourt ta table de hachage donc l'algorithme : Ce qui donnerai qqchose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    // Déclaration de structure coordonnées (position et numéro de ligne) 
    typedef struct c{
    int pos;
    int nl;
    struct c *suivant;
    }Coordonnees;
     
    // Déclaration de la structure de liste (contient les coordonnées) 
    typedef struct L2{ 
        int freq; 
    	mots *m; 
    	Coordonnees *c; 
    	int entier;
    	struct L2 *suivant; 
    }Liste;
     
    // Fonction qui parcourt la table de hach
    void MaFonctionACompleter(Liste **TableHash) 
    {
    	// éléments courant lors du parcourir de la table
    	Liste **current_ItemOf_TableHash = malloc (TAILLEHASH * sizeof *TableHash);
    	// éléments qui va parcourir la table
    	Liste **Next_ItemOf_TableHash = malloc (TAILLEHASH * sizeof *TableHash);
    // Pareil pour les pointeurs sur les listes chainée : 
    Coordonnees * currentPtrCoordonnees = malloc (sizeof *Coordonnees);
    Coordonnees * otherPtrCoordonnees = malloc (sizeof *Coordonnees);
     
    	// On dit que notre éléments courant de la table de hash pointe sur le premier éléments de la TableHash
    	current_ItemOf_TableHash = TableHash; 
     
    	// Tant qu'il y a des éléments, on continue à parcourir la table de hachage
    	while(current_ItemOf_TableHash != null) 
    	{
    // on parcourt la liste chainée et on compare les éléments courant avec les autres
    		Next_ItemOf_TableHash = current_ItemOf_TableHash + sizeof(TableHash); 
    		while(Next_ItemOf_TableHash != null) 
    		{
    			while(current_ItemOf_TableHash->Liste != null)
    			{
    				currentPtrCoordonnees = current_ItemOf_TableHash->Liste->Coordonnees;
    				while(Next_ItemOf_TableHash->Liste != null)
    				{
    					otherPtrCoordonnees = Next_ItemOf_TableHash->Liste->Coordonnees;
    					if(currentPtrCoordonnees->nl ==  otherPtrCoordonnees-> nl && currentPtrCoordonnees->pos == (otherPtrCoordonnees->pos+1) )
    {
    cpt ++; 
    if (cpt >= 2) 
    {
    // On concatène ici *********************
    cpt = 0; 
    }
    }
    					otherPtrCoordonnees = Next_ItemOf_TableHash->Liste->suivant;
    				}
    currentPtrCoordonnees = current_ItemOf_TableHash->Liste->suivant;
    			}
    			 =  
    		Next_ItemOf_TableHash = ; 
    	}
     
    	// j'sais plus trop comment on va à l'élément suivant : 
    	//soit : current_ItemOf_TableHash = current_ItemOf_TableHash + (sizeof *TableHash); 
    	//soit : current_ItemOf_TableHash++; 
    }
    Bon, c'est sur qu'au niveau syntaxe, yaura des trucs à revoir mais l'état d'esprit y est ^^

    Alex.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Points : 65
    Points
    65
    Par défaut
    salut est-ce que vous trouvez ici une bonne fonction de hachage?
    parce que je cherche une fonction de hachage.
    Merci

  8. #8
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonsoir

    Citation Envoyé par ciol2.6.12 Voir le message
    Je crois pas. En effet il y aura toujours des collisions, mais dans les faits, c'est très rare voir impossible, avec une bonne fonction de hachage (surtout si ce sont des mots qui ont un sens).

    Mais là, je parle du hash code. Et lui, il parle de l'entrée dans la table de hachage. Sa table a une taille de 31 (cf le modulo 31), donc en effet il y aura toujours des collisions. Et dans une table de hachage, c'est normal.
    Faudrait calculer la probabilité, le paradoxe des anniversaires dit juste que ce n'est pas 1/31, mais ça reste dans cet ordre de grandeur.
    Eviter complètement les collisions est impossible mais par contre, ce que l’on peut faire c’est d’essayer de ne pas avoir ou éviter d’avoir des collisions en s’assurant d’avoir une très bonne fonction de hachage.
    Le cas d’un hachage parfait (cité plus haut )dépend fortement de la stratégie de résolution des collisions. On considère ou définit un hachage parfait si :
    • Il ne génère aucune collision.
    • Que le nombre d’accès mémoire pour faire une recherche est pour le cas le plus défavorable de O(1).
    • Que la table de hachage secondaire ne garantit aucune collision en choisissant la bonne fonction de hachage.
    • Que l’on connait à l’avance le nombre d’éléments permettant de définir une meilleure fonction de hachage (en clair, que l’ensemble des clés soit statique et connu à l’avance)


    En somme, pour du hachage, le choix de résolution de collisions est important mais tout dépend de ce que l’on veut faire:
    • Souhaitez-vous obtenir aucune collision ? :
      Dans ce cas, on opte pour un hachage parfait dont le but est d’avoir deux niveaux de hachage en utilisant un hachage dit universel à chaque étage en clair:
      • Le premier étage (si je peux dire ainsi) est un hachage chainé. C’est à dire, que les clés x sont hachées vers "n" case du tableau, grâce à une très bonne fonction de hachage ( définis H pour l'exemple) choisie à l’avance dans un ensemble de fonctions de hachage dit universel. Et au lieu de chainer les clés, il faut utiliser une table de hachage secondaire (deuxième étage pour l'exemple Tsi) que l’on associe à une fonction de hachage dite universelle (pour l'exemple Hi) pour garantir que l’on n’obtienne aucune collision au second étages.
    • Vous souhaitez avoir une table de hachage avec une gestion de collisions ?:
      Dans ce cas on opte pour une stratégie de gestion des collisions qui peut être :
      • Par chainage dite également hachage simple: Chaque case du tableau est le début d’une liste chainée de tous les éléments en collision.
      • Par déplacement: dès lors qu’une case du tableau est occupée par le premier élément, on place le second élément dans l’une des premières cases libres qui suit (si elle est libre) mais par contre la recherche de la donnée est très longue puisqu’il faut parcourir toutes les cases successives tant qu’elles ne sont pas vides et que l’on n’a pas trouvé la donnée en question. C’est d’autant plus compliqué pour la suppression de celle-ci car on peut avoir des cases vides à cause des éléments qui ont la même signature (même clé)
      • Par double hachage: en cas de collision au lieu de faire un déplacement dans une case vide, on se déplace d’une valeur donnée par une seconde fonction de hachage, ce qui permet d’éviter des données qui ont des signatures proches. Cette technique est plus souvent utilisée en adressage ouvert (tout élément occupe la table de hachage elle-même, en clair, chaque case contient un élément ou rien).




    Citation Envoyé par Ptitlex Voir le message
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    // Déclaration de structure coordonnées (position et numéro de ligne) 
    typedef struct c{
    int pos;
    int nl;
    struct c *suivant;
    }Coordonnees;
     
    // Déclaration de la structure de liste (contient les coordonnées) 
    typedef struct L2{ 
        int freq; 
    	mots *m; 
    	Coordonnees *c; 
    	int entier;
    	struct L2 *suivant; 
    }Liste;
     
    // Fonction qui parcourt la table de hach
    void MaFonctionACompleter(Liste **TableHash) 
    {
    	// éléments courant lors du parcourir de la table
    	Liste **current_ItemOf_TableHash = malloc (TAILLEHASH * sizeof *TableHash);
    	// éléments qui va parcourir la table
    	Liste **Next_ItemOf_TableHash = malloc (TAILLEHASH * sizeof *TableHash);
    // Pareil pour les pointeurs sur les listes chainée : 
    Coordonnees * currentPtrCoordonnees = malloc (sizeof *Coordonnees);
    Coordonnees * otherPtrCoordonnees = malloc (sizeof *Coordonnees);
     
    	// On dit que notre éléments courant de la table de hash pointe sur le premier éléments de la TableHash
    	current_ItemOf_TableHash = TableHash; 
     
    	// Tant qu'il y a des éléments, on continue à parcourir la table de hachage
    	while(current_ItemOf_TableHash != null) 
    	{
    // on parcourt la liste chainée et on compare les éléments courant avec les autres
    		Next_ItemOf_TableHash = current_ItemOf_TableHash + sizeof(TableHash); 
    		while(Next_ItemOf_TableHash != null) 
    		{
    			while(current_ItemOf_TableHash->Liste != null)
    			{
    				currentPtrCoordonnees = current_ItemOf_TableHash->Liste->Coordonnees;
    				while(Next_ItemOf_TableHash->Liste != null)
    				{
    					otherPtrCoordonnees = Next_ItemOf_TableHash->Liste->Coordonnees;
    					if(currentPtrCoordonnees->nl ==  otherPtrCoordonnees-> nl && currentPtrCoordonnees->pos == (otherPtrCoordonnees->pos+1) )
    {
    cpt ++; 
    if (cpt >= 2) 
    {
    // On concatène ici *********************
    cpt = 0; 
    }
    }
    					otherPtrCoordonnees = Next_ItemOf_TableHash->Liste->suivant;
    				}
    currentPtrCoordonnees = current_ItemOf_TableHash->Liste->suivant;
    			}
    			 =  
    		Next_ItemOf_TableHash = ; 
    	}
     
    	// j'sais plus trop comment on va à l'élément suivant : 
    	//soit : current_ItemOf_TableHash = current_ItemOf_TableHash + (sizeof *TableHash); 
    	//soit : current_ItemOf_TableHash++; 
    }
    Bon, c'est sur qu'au niveau syntaxe, yaura des trucs à revoir mais l'état d'esprit y est ^^

    Alex.
    je trouve le code source posté ci-dessus assez lourd j'ai essayé d'apporter quelques éléments. Mais attention le code sources est à revoir dans le sens large du terme et non le prendre comme tels

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
     
    /*
     ============================================================================
     Name        : Untitled 9.c
     Author      : SAMBIA39
     Version     : 0.1
     Copyright   : Copyright (c) 2016 SAMBIA39
     Description : Ansi-style
     ============================================================================
     */
     
    #define MAX 10
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    /*
     * Structure de donnée
     */
    typedef struct s_data{
        char *pname;
        struct s_data *ptr;
    }DATA;
     
    /*
     * Table de hachage
     */
    DATA *pHash[MAX] = { NULL };
     
    /*
     * Creation des nouvel donné
     * a insérer
     */
    DATA *f_new_data( char *ptr ){
        DATA *p = NULL;
        extern int errno;
     
        errno = 0;
        if( NULL == ( p = malloc( sizeof(DATA))) ){
            fprintf( stderr, "(%d)\t:%s\n\t:%s\n", errno,
                "Erreur allocation cellule", strerror(errno) );
            return NULL;
        } 
     
        if( NULL == ( p->pname = strdup(ptr) ) ){
            free( p );
            p = NULL;
            fprintf( stderr, "(%d)\t:%s\n\t:%s\n", errno,
                "Erreur allocation data", strerror(errno) );
            return NULL;
        }
        p->ptr = NULL;
        return p;
    }
     
    /*
     * Ajout des donnée en tête de liste
     */
    DATA *f_add_data( DATA *ptr, DATA *p_new ){
     
        if( NULL == p_new  )
            return NULL;
        p_new->ptr = ptr;
        return p_new;
    }
     
    /*
     * Fonctions qui affiche la liste des 
     * colission  
     */
    void f_print_list( DATA *ptr ){
        unsigned int i = 0;
        while( NULL != ptr ){
            fprintf( stdout, "(%d)\t%s\n", i++, ptr->pname );
            ptr = ptr->ptr;
            getchar(); //
        }
    }
     
    /*
     *  Affichage des données
     */
    void f_print_data( void ){
     
        unsigned int i = 0;
        for( i = 0; i < MAX; i++ ){
            if( NULL != pHash[i] ){
                fprintf( stdout, "Colission des [%d]\n", i );
                f_print_list( pHash[i] );
            }
            getchar(); //
        }
     
    }
     
    /*
     * Fonction de hachage 
     * (Pas térible)
     */
    unsigned short f_get_id( char *ptr ){
     
        unsigned short k = 0;
        if( NULL != ptr ){
            while( '\0' != *ptr)
                k = ( k * 31 + (unsigned char)*(ptr++)) % MAX;
        }
        return k;
    }
     
    /*
     * Fonction principale
     */
     
    int main( void ){
     
        /*
         * Ensemble des déclarations
         */
        char *ptr = NULL;   
        extern int errno;
        FILE *pFile = NULL;
        unsigned int k = 0;
        char buffer[ BUFSIZ ];
     
        /*
         * Ouverture du fichier
         */
        errno = 0;
        if( NULL == ( pFile = fopen( "main.c", "r") ) ){
            fprintf( stderr, "(%d)\t:%s\n\t:%s\n", errno,
                "Erreur allocation data", strerror(errno) );
            return EXIT_FAILURE;
        }
     
        /*
         * Parcourd du fichier
         */
        while( NULL != fgets( buffer, BUFSIZ, pFile ) ){
            ptr = strtok( buffer, "\t\n" );
            while( ptr != NULL ){
                k = f_get_id( ptr );
                if( NULL == pHash[k] ){
                    if( NULL == (pHash[k] = f_new_data(ptr)) )
                        exit( -1 );
                }else{
                    if( NULL == (pHash[k] = f_add_data( pHash[k], 
                        f_new_data(ptr) )))
                        exit( -1 );
                }
                ptr = strtok( NULL, "\t\n" );
            }
        }
     
        /*
         * Fin du fichier 
         */
        fclose( pFile );
        pFile = NULL;
     
        /*
         * Teste de controle
         */
        f_print_data();
     
        /*
         * A faire 
         * Libérer la mémoire aloué 
         * Recherché une donnée 
         * Suprimer une donnée 
         * Suprimer la liste entière d'une clé 
         * Adapté le code ( allégé )
         */
     
        return EXIT_SUCCESS;
    }

    L'idéal est d'implémenter une liste doublement chainée pour une suppression plus souple et rapide cela permet également de mieux insérer et manipuler les données de collision qui ont la même clé. Avec une liste chaine simple c'est lourd, et pour la recherche, il faut parcourir toute la liste etc. ( bref c'est un avis )

    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

Discussions similaires

  1. Appliquer la fonction de hachage MD5 à un texte
    Par 9tita dans le forum Sécurité
    Réponses: 2
    Dernier message: 01/05/2011, 16h13
  2. Recherche d'une fonction de hachage
    Par druzy dans le forum Langage
    Réponses: 13
    Dernier message: 26/11/2007, 21h09
  3. [Oracle / Fonction hachage] Fonction de hachage SHA / MD5
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 8
    Dernier message: 26/01/2006, 08h58
  4. Fonction de Hachage
    Par Schlada dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h42
  5. Fonction de hachage
    Par killer crok dans le forum C
    Réponses: 12
    Dernier message: 02/10/2002, 09h48

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