[gull] Petit problème de maths, pour créer de liens

Daniel Cordey dc at mjt.ch
Tue May 6 11:02:09 CEST 2008


On Tuesday 06 May 2008, Sebastien Chassot wrote:

> A partir de cette liste je pense que faire une vérification approfondie
> est important et puisqu'il y a controverse sur md5 n'utiliser que diff
> me paraît aussi bien. D'autant plus que pour le hashage, il faut faire
> plusieurs opérations sur chaque block du fichier ( "mixer" un bloc,
> faire un OU avec le bloc précédent, stocker,...) et qu'en plus certain
> ne semblent pas rassuré par la méthode. Une comparaison bit à bit est
> sans doute plus rapide (j'en sais rien remarque) et plus sûr (il y a eu
> une remarque intéressante de Yves Martin qui proposait d'optimiser en
> comparant N fichiers "semblables" d'un coup plutôt que N*diff). Dans la
> mesure ou il faut être capable de déceler comme tu le relève la moindre
> différence, la question se résume à mon sens à : Quel est le moyen de le
> faire le plus rapidement possible ? Quand on traque un bit la
> probabilité de passer à côté dépend de la taille du fichier et est bien
> plus grande qu'une collision md5. Je crois qu'on est d'accord,
> "survoler" à un moment ou un autre toute la surface du fichier est le
> seul moyen pour ne pas avoir de problème (le risque de confusion entre
> deux fichiers est grand), le faire deux fois n'apporte rien et le faire
> avec diff ou md5 offre la même sécurité (risque de collision
> négligeable).

L'utilisation de md5* est interessante a partir du moment ou l'on va 
regulierement effcetuer cette operation de comparaison. En conservant les 
valeurs des md5, pour les fichiers non-modifies apres, on peut se contenter 
de ne recalculer les md5 que pour les fichiers dont le contenu a change. 
C'est valable seulement si le nombre de nouveau fichiers ou les chamgements 
ne sont pas tres nombreux. En fait, c'est une affaire de compromis.

Par contre, partant du principe qu'un md5 va de toute facon lire l'integralite 
de chaque fichier, en consacrant en plus du temps CPU au calcul, cela est 
forcement plus lent qu'une simple lecture... Donc, si le taux de changement 
est important, la comparaison byte/byte sera sans doute plus efficace. Dans 
ce cas, j'ecrirais un programme en C, charge de prendre N fichiers de taille 
identique, avec un algorithme de comparaison progressif. La seule restriction 
est que cela ne sera pas efficace si l'on a trop de fichiers de la meme 
taille (et cela depend aussi de la taille des fichiers). Un 
algorithme "progressif" permettra d'eliminer tres vite les fichiers qui 
different en arretant leur lecture des detection de difference. Il ne s'agit 
pas d'un "diff" mais d'un "Ndiff" un peu special. Et... dans ce cas, ecrire 
le code en C laissera sur place tout autre langage sans aucune discussion 
possible :-)

Je vais en discuter avec Felix tout-a-l'heure. SI jamais il part dans cette 
voei, comme le code n'est pas tres difficile a ecrire, je lui ferai cette 
fleure :-)

dc




More information about the gull mailing list