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 :

Hashage d'un array: problème avec l'algorithme du tutoriel


Sujet :

Java

  1. #1
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    910
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 910
    Points : 1 363
    Points
    1 363
    Par défaut Hashage d'un array: problème avec l'algorithme du tutoriel
    Bonjour,
    J'ai une array de int à hasher et j'utilise l'algorithme du tutoriel mais j'ai très vite des hash dupliquées.

    Je prends comme SEED 3 et comme MULTIPLIER 5

    Si mon array vaut {145} le hash vaut 3*5+145=160
    Si mon array vaut {14,15} le hash vaut (3*5+14)*5+15=160
    Si mon array vaut {7,50} le hash vaut (3*5+7)*5+50=160
    ...

    Qu'est-ce qu'il y aurait comme amélioration à apporter ou autre algorithme pour hasher ces tableaux ?

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Bonjour,

    je te conseillerais de mieux choisir ton multiplieur, c'est lui qui a le rôle le plus central (à première vue).

    5 est un peut trop 'banal'. Dans le tuto, c'est 17 et dans la JRE c'est 31 (Arrays.hashCode).

    Bien entendu, si ton appli manipule essentiellement des multiples de 31, utilise plutôt 37.
    Je pense que si tu tapes dans les nombres premiers, tu auras de meilleurs résultats de manière générale.

    Note:
    Si tu faisais une méthode de hash de tableaux pour un besoin et non pour l'expérience, tu peux très bien te rabattre sur la méthode Arrays.hashCode).

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    Bonjour,

    Le tutoriel est un exemple, si tu veux une fonction de hashage qui minimise les collisions tourne toi vers les fonctions de hashage cryptographique comme MD5 ou SHA.
    Tu es certains que dans un même groupe de valeur aucune n'aura le même hash. Ils sont conçus pour ça.

  4. #4
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    910
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 910
    Points : 1 363
    Points
    1 363
    Par défaut
    J'ai fait un rapide savant calcul pour m'apercevoir qu'avec 3 et 5 j'étais très limité dans le range de int que je pouvais utiliser (très exactement le int max vaut 67 ) donc j'ai revu le Seed et le Multiplier pour pouvoir un max plus élevé et qu'une array de 20 int < ce max donne un hash qui soit toujours un long (je détermine le max tel que hash({1,2})>=hash({max+1}))

    Conclusion: Seed=89, Multiplier=7

    Je n'ai pas poussé ma réflexion plus loin. Si je constate d'autres anomalies, j'irai du côté des algorithme de cryptage. Je crains juste le temps que cela mettrais pour crypter +-65000 array.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    Attention on dit chiffrement et pas cryptage, MD5 et SHA sont des algorithmes de hashage, ce qui n'est pas du tout la même chose que du chiffrement.

    On dit que ce sont des algorithmes de hashage cryptographique car ils possèdent plusieurs propriétés :
    - Il est très difficile de retrouver le texte à partir du hash.
    - Il est très difficile de générer la même signature que celle d'un texte déjà connu.
    - Il est très difficile avec 2 messages aléatoires d'obtenir le même hash.

    Et non ils sont très rapides, des implémentations comme BouncyCastle sont très utilisé un peu partout.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Jimmy_ Voir le message
    Et non ils sont très rapides, des implémentations comme BouncyCastle sont très utilisé un peu partout.

    Heu non.
    Ils ont beau être assez rapide, il y a un monde de performance entre faire un hash cryptographique de 65.000 données et faire 65.000 hash séparés!

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    Effectivement, mais si la condition initial est de n'avoir aucune collision. Il n'y a pas vraiment le choix.

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    on ne peux pas n'avoir "aucune" collision avec du hashage.

    Si je prend des chaines de 10 caractère, soit 800 bits, je ne peux pas garantir de non-collision quand je la réduit à 32 bits (taille d'un int java), et le hashage cryptographique ne garantis pas ça non plus. Le hashage crypto te garanti seulement qu'il est presque impossible de construire délibérément une autre chaine de caractère avec le même hash.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    presque impossible de construire délibérément une autre chaine de caractère avec le même hash
    C'est ce que j’essaie de faire comprendre. Il faut aussi ajouter que si c'est le cas le message ayant le même hash sera de toute manière tellement différent qu'il n'y a aucune chance en pratique qu'il fasse partie du domaine de valeur de ce message. Ne pas oublier que ces algorithmes possèdent un effet avalanche. Pour chaque bit différent en entrée, il y a 50% de chance que cela modifie chaque bit de la sortie.

    Alors on peut toujours pinailler dans la nuance du presque impossible et zero collision. En pratique si tu haches quelques milliards de message avec SHA-256 tu as très largement plus de chance de gagner au loto que de trouver une collision.

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Sauf qu'on est pas dans un range 256bits, mais dans un range 32 bits. Les risque de collision sont exactement de 1/2^32 par paire. Le 60.000ème élément a donc en cochonne approximation 60.000 fois ce risque (entre 2^15 et 2^16 * 1/2^32), ce qui nous amène à une probabilité approximée cochon de 1/2^17. Soit une chance sur 130.000 d'avoir un cas de collision.

    Sur 60.000 hash, on n'est donc plus dans le négligeable. Le hashcode de java n'a pas pour but d'être unique, donc encore une fois, aucune raison de plomber les performances en utilisant un hash cryptographique!

  11. #11
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    910
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 910
    Points : 1 363
    Points
    1 363
    Par défaut
    Bon j'ai fait mes comptes, et abandonné le hashage java. Beaucoup trop de doublons.
    J'ai fait comme test en partant d'un tableau de nombres allant de 1 à 20 et j'en ai fait toutes les combinaisons de 1 à 3 nombres. Sur les 1561 combinaisons, j'ai quand même 25% de doubles. Si je monte jusque 100, je passe à 3% de doubles. Ca reste trop.

    Maintenant je suis passé à un algorithme FLV en 64bits. L'algorithme est très rapide: on n'est pas dans le domaine du cryptographique. Je n'ai pas encore fait de test de charge, mais cela me semble plus rapide que la technique du hashage java. Résultat plus aucun doublons

    Ici le code source dont je me suis servi pour ce hashage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec package algorithmic et algorithm
    Par ibma4 dans le forum Mise en forme
    Réponses: 1
    Dernier message: 19/12/2009, 07h53
  2. Problème avec l'algorithme minimax pour un morpion
    Par Electroniktor dans le forum Intelligence artificielle
    Réponses: 0
    Dernier message: 26/10/2009, 21h18
  3. Petit problème avec l'algorithme de Dijkstra
    Par Raiden1234 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 28/11/2008, 16h22
  4. Probléme avec l'algorithme negamax
    Par akkinaj dans le forum Débuter
    Réponses: 1
    Dernier message: 25/06/2008, 02h02
  5. problème avec un ALGORITHME
    Par ulysse031 dans le forum Mathématiques
    Réponses: 4
    Dernier message: 17/02/2007, 15h59

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