comparaison de 'hash'

Le
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"
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul Gaborit
Le #22119651
À (at) Fri, 14 May 2010 14:23:11 +0200,
"kurtz_le_pirate"
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 - Perl en français -
kurtz le pirate
Le #22120371
In article Paul Gaborit
...
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
Publicité
Poster une réponse
Anonyme