Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

comparaison de 'hash'

2 réponses
Avatar
kurtz_le_pirate
bonjour,

j'ai deux hash.

le premier :
my %SrcDatas;
il est repli avec :
$SrcDatas{$nom_du_fichier}=$MD5_du_fichier;

le deuxième :
my %Datas;
il est rempli avec :
$Datas{$nom_du_fichier}{$nom_du_serveur}=$MD5_du_fichier;

rien de bien complique. mon but maintenant est de comparer pour
chaque serveur, que la liste des fichiers soit identique (même
nombre, même nom, même MD5) que ceux dans %SrcDatas.


existe-t-il un module perl pour comparer des 'hash' facilement
ou bien je dois faire une boucle pour chaque serveur, dans
laquelle je fais une boucle pour chaque fichier qui compare les
noms, les MD5... ?

aurais-je du choisir un autre modele de données ?


merci de votre avis.


--
klp
"bug : problème d'interface entre la chaise et le clavier"

2 réponses

Avatar
Paul Gaborit
À (at) Fri, 14 May 2010 14:23:11 +0200,
"kurtz_le_pirate" écrivait (wrote):

j'ai deux hash.

le premier :
my %SrcDatas;
il est repli avec :
$SrcDatas{$nom_du_fichier}=$MD5_du_fichier;

le deuxième :
my %Datas;
il est rempli avec :
$Datas{$nom_du_fichier}{$nom_du_serveur}=$MD5_du_fichier;

rien de bien complique. mon but maintenant est de comparer pour
chaque serveur, que la liste des fichiers soit identique (même
nombre, même nom, même MD5) que ceux dans %SrcDatas.


existe-t-il un module perl pour comparer des 'hash' facilement
ou bien je dois faire une boucle pour chaque serveur, dans
laquelle je fais une boucle pour chaque fichier qui compare les
noms, les MD5... ?

aurais-je du choisir un autre modele de données ?



Il est souvent intéressant de faire ce genre de tests lorsqu'on collecte
les données plutôt qu'à posteriori comme ça les boucles sont déjà
réalisées implicitement... Mais supposons que ce n'est pas faisable.

La méthode à choisir dépend beaucoup du résultat attendu. On ne
procédera pas de la même manière selon qu'on attend une réponse du
type :

1- oui(tout est pareil)/non(il y a des différences).
2- tel serveur est différent des données locales.
3- pour chaque serveur, la liste des fichiers en trop, la liste des
fichiers manquants, la liste des fichiers dont le MD5 différe.

Je suppose aussi qu'on dispose aussi de la liste des serveurs
(@serveurs).

Une solution qui donne des réponses détaillées pourrait être la suivante
(je n'ai pas testé le code) :

# recherche des fichiers manquants ou différents
my %fichiers_manquants;
my %fichiers_differents;
foreach my $local_file (keys %SrcDatas) {
if (not defined $Datas{$local_file}) {
# le fichier n'existe sur aucun serveur
$fichiers_manquants{$local_file} = [@serveurs];
next;
}
foreach my $serveur (@serveurs) {
if (not defined $Datas{$local_file}{$serveur}) {
# le fichier n'existe pas sur $serveur
push @{$fichiers_manquants{$local_file}}, $serveur;
} elsif ($Datas{$local_file}{$serveur}
ne $SrcDatas{$local_file}) {
# le fichier diffère sur $serveur
push @{$fichiers_differents{$local_file}}, $serveur;
}
}
}

# recherche des fichiers en surplus
my %fichiers_ensurplus;
foreach my $file (keys %Datas) {
if (not defined $SrcDatas{$file}) {
# le fichier n'existe pas en local
$fichiers_ensurplus{$file} = [keys %{$Datas{$file}}];
}
}

Les clés de %fichiers_manquants donnent la liste des fichiers locaux qui
manquent sur au moins un serveur (et on associe à chaque nom de fichier
la liste des serveurs sur lesquels il n'existe pas).

Le tableau associatif %fichiers_differents est bâti sur le même principe
mais pour les fichiers qui diffèrent par leur MD5.

Les clés de %fichiers_ensurplus donnent la liste des fichiers qui
existent sur au moins un serveur sans exister en local (et on associe à
chaque nom de fichier la liste des serveurs sur lesquels il est en
surplus).

Mais il faudrait adapter les structures de données qui collectent les
réponses à la manière dont tu comptes exploiter ces réponses...

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
kurtz le pirate
In article ,
Paul Gaborit wrote:

...
Il est souvent intéressant de faire ce genre de tests lorsqu'on collecte
les données plutôt qu'à posteriori comme ça les boucles sont déjà
réalisées implicitement... Mais supposons que ce n'est pas faisable.



si bien sûr que c'est faisable. je n'y avais pas pensé. c'est plutot
je collecte tout puis j'analyse...


La méthode à choisir dépend beaucoup du résultat attendu. On ne
procédera pas de la même manière selon qu'on attend une réponse du
type :

1- oui(tout est pareil)/non(il y a des différences).
2- tel serveur est différent des données locales.
3- pour chaque serveur, la liste des fichiers en trop, la liste des
fichiers manquants, la liste des fichiers dont le MD5 différe.
...



oui, c'est bien le point 3 auquel je voudrais arriver.


je vais lire calmement ta réponse et voir comme adapter tout cela à
mes besoins.



en tout cas, merci beaucoup.


--
klp