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

Sécurité Java Discussion :

Adler32 ou CRC32 me donne les mêmes valeurs pour 2 tableaux distincts


Sujet :

Sécurité Java

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 106
    Points : 182
    Points
    182
    Par défaut Adler32 ou CRC32 me donne les mêmes valeurs pour 2 tableaux distincts
    Bonjour/bonsoir

    J'ai voulu utiliser les checksums pour comparer 2 images mais j'ai eu un souci car avec 2 tableaux de pixels différents j'ai les mêmes valeurs de checksum que ce soit avec Adler32 ou CRC32
    1) Est ce un bug ou bien est ce une mauvaise utilisation des checksums pour mon cas?
    2) Existe-t-il un autre moyen pour avoir 2 valeurs de checksums différentes pour 2 tableaux distincts?

    Merci

    Voici mon code ou j'ai diminué le nombre de pixels pour l'exemple
    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
     
    int[] data1 = new int[]{0,65280};
    int[] data2 = new int[]{-16777216,0};
     
    //    Checksum checksum1 = new Adler32();
    Checksum checksum1 = new CRC32();
    for(int i = 0; i < data1.length; i++)
      checksum1.update(data1[i]);
    System.out.println(checksum1.getValue());
     
    //    Checksum checksum2 = new Adler32();
    Checksum checksum2 = new CRC32();
    for(int i = 0; i < data2.length; i++)
      checksum2.update(data2[i]);
    System.out.println(checksum2.getValue());

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hao,

    C'est écrit dans la doc Java:
    Citation Envoyé par Doc Java
    update(int b)
    Updates CRC-32 with specified byte.
    Bien qu'on passe un int, seul 1 byte est utilisé, celui de plus faible poids, qui dans le cas de tes exemples, vaut toujours 0...

    Pour un int, il faut donc faire 4 update de suite.

    Par exemple, d'après ton code, il faudra faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		Checksum checksum2 = new CRC32();
    		for (int i = 0; i < data2.length; i++) {
    			int n = data2[i];
    			for (int j = 0; j < 4; ++j) {
    				checksum2.update(n);
    				n >>= 8;
    			}
    		}
    		System.out.println(checksum2.getValue());
    ps : la doc de Java est assez complète et bien faite, il faut l'utiliser.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 106
    Points : 182
    Points
    182
    Par défaut
    Grand merci à toi, je vais modifier mon algo pour cela.
    C'est quand même bizarre qu'il utilise un int en tant que paramètre au lieu d'un byte, cela aurait été plus logique.

    En tout cas, merci

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/10/2012, 19h31
  2. Réponses: 1
    Dernier message: 10/03/2009, 22h54
  3. Réponses: 2
    Dernier message: 12/01/2009, 11h27
  4. 2 variables qui pointent vers les mêmes valeurs: comment l'éviter?
    Par skystef dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 03/04/2008, 11h51
  5. Réponses: 4
    Dernier message: 17/01/2008, 07h36

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