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

Java Discussion :

fonction de hachage


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Par défaut fonction de hachage
    Bonjour,

    je souhaite actuellement développer ma propre fonction de hachage. Après des recherches sur internet pour en comprendre le fonctionnement, je me suis aperçu que chaque caractère pouvait etre affecté à un int et que cela donnais une valeur différente pour chaque caractère

    Par conséquent, je me demande si une fonction de hachage ne pourrait pas simplement être écrite comme ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int fonctionHash(String s){
     
        int h = 0;
     
        for(int i = 0; i<s.length();i++){
     
             h += s.charAt(i);
     
        }
     
        return h;
     
    }
    Sur les quelques tests que j'ai effectué cela me donne bien une valeur différente pour chaque String que j'ai testée mais j'ai l'impression que la fonction est trop simple...

    Pourriez vous donc me dire si cela est une fonction de hachage correcte ou non? Si non je voudrais également savoir pourquoi elle n'est pas correcte?

    Par ailleurs j'ai trouvé sur le net une fonction faite a peu près de la même manière sauf dans la boucle (voir ci-dessous) :

    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
     
     
    int fonctionHash(String s){
     
        int B = 256; (en reference a une puissance de 2?)
        int N = 311; (en reference à un nombre premier?);
        int h = 0;
     
        for(int i = 0; i<s.length();i++){
     
             h = (h*B + s.charAt(i)) % N;
     
        }
     
        return h;
     
    }
    Pourquoi dans cet exemple les developpeurs n'ont ils pas simplement pris la valeur de s.charAt(i) comme je l'ai fait?


    merci

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Citation Envoyé par nzo70 Voir le message
    Pourquoi dans cet exemple les developpeurs n'ont ils pas simplement pris la valeur de s.charAt(i) comme je l'ai fait?
    Parce que le but d'une fonction de hachage est d'assurer au maximum que deux chaînes différentes donnent des hachages différents.

    Dans ton cas, le hachage est mauvais : il ne tient pas compte de l'ordre dans lequel sont tes lettres. Ainsi, tous les anagrammes auront la même valeur hachée.

    L'algorithme que tu as trouvé est meilleurs : la valeur "h" étant réutilisée dans le calcul, les anagrammes auront plus facilement des hachages différents.

    Vérifie toi-même
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Souviens-toi des deux règles de base des fonctions de hash:
    Si y = hash(x);

    - Il est très difficile* de trouver un z différent de x tel que hash(z) = y
    - Il est très difficile* de retrouver x en se basant uniquement sur y.

    On part bien sûr du principe que tout le monde connaît l'algorithme.

    Si ton algorithme ne respecte pas ces deux règles, il ne s'agit pas d'un bon algorithme de hash.
    Ici, ton premier algo ne respecte pas la première règle.

    Le deuxieme algo ne respecte pas la seconde règle car si on hashe une seule lettre, le résultat est exactement la valeur ASCII de cette lettre

    *très difficile, en crypto, signifie "trop long". Le minimum syndical étant que l'algorithme de force brute (c'est à dire qui consiste à tester toutes les possibilités) doit s'effectuer en plus de 2^80 opérations (enfin ça c'était il y a deux ans je ne sais pas si ça a changé)

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