[..] Hashage de fichier par parties le plus rapide ?
Règles du forum
- Merci de consulter la section "Règles du forum" et plus particulièrement "Règles et Mentions Légales du site autoitscript.fr" avant d'écrire un message.
[..] Hashage de fichier par parties le plus rapide ?
Bonjour,
Je travaille en ce moment sur de l'envoi de fichiers par TCP, et j'explore plusieurs pistes. Actuellement, le transfert marche bien, avec un buffer, pour éviter de balancer de gros fichiers en RAM, et pour pouvoir tester le hash de ces parties.
Mon principal problème est le suivant : Je souhaite utiliser un buffer relativement petit (4096 bits) pour faciliter le transfert et éviter des erreurs potentielles. A l'arrivée du buffer sur le client, il teste avec un hash fourni par le serveur pour la partie envoyée, et s'il ne correspond pas, demande le réenvoi de la partie actuelle, autrement, il passe à la partie suivante.
Le seul souci, c'est la lenteur du hash. En passant par les fonctions de cryptages natives d'AutoIt en MD5 [_Crypt_HashData("DonnéesAHasher", $CALG_MD5)], c'est extrêmement lent : Plusieurs heures de hashage pour un fichier de 4,1Go.
J'ai testé avec un buffer de 4MB, c'est plus rapide : 4 minutes de hashage.
J'ai donc plusieurs questions sur mon approche :
Tout d'abord, la façon dont sont envoyés les hashes. Est-il préférable de :
- Balancer le hash et le buffer sur une seule requête TCP, et de comparer à la volée par le client ?
- Balancer le fichier complet, puis le hash global, et en cas de mismatch, calculer les hashs détaillés pour une comparaison en fonction de la taille des parties (Actuellement, 4MB) ?
- Balancer le fichier complet, puis les hashs détaillés dans tous les cas, et comparés toutes les parties du fichiers une-à-une ?
Ensuite, au niveau du hashage en lui-même : N'y a-t-il pas plus rapide et/ou plus adapté pour des petits buffers ? Avec un MD5 pour 4Ko de buffer, j'ai l'impression de sortir un tank pour tuer une mouche...
Et pour finir : Quelle taille de buffer est la plus adaptée, en prenant en compte le hashage ? Y'a-t-il un risque de pertes plus important avec une grosse requête TCP d'un coup, ou c'est juste une "superstition" de ma part ? S'il faut rester sur un petit buffer (4Ko), pourquoi ? En passant sur un plus gros (4MB par ex.), est-ce adapté niveau vitesse de transfert et hashes ?
Merci à vous pour votre aide, en espérant avoir été clair.
Je travaille en ce moment sur de l'envoi de fichiers par TCP, et j'explore plusieurs pistes. Actuellement, le transfert marche bien, avec un buffer, pour éviter de balancer de gros fichiers en RAM, et pour pouvoir tester le hash de ces parties.
Mon principal problème est le suivant : Je souhaite utiliser un buffer relativement petit (4096 bits) pour faciliter le transfert et éviter des erreurs potentielles. A l'arrivée du buffer sur le client, il teste avec un hash fourni par le serveur pour la partie envoyée, et s'il ne correspond pas, demande le réenvoi de la partie actuelle, autrement, il passe à la partie suivante.
Le seul souci, c'est la lenteur du hash. En passant par les fonctions de cryptages natives d'AutoIt en MD5 [_Crypt_HashData("DonnéesAHasher", $CALG_MD5)], c'est extrêmement lent : Plusieurs heures de hashage pour un fichier de 4,1Go.
J'ai testé avec un buffer de 4MB, c'est plus rapide : 4 minutes de hashage.
J'ai donc plusieurs questions sur mon approche :
Tout d'abord, la façon dont sont envoyés les hashes. Est-il préférable de :
- Balancer le hash et le buffer sur une seule requête TCP, et de comparer à la volée par le client ?
- Balancer le fichier complet, puis le hash global, et en cas de mismatch, calculer les hashs détaillés pour une comparaison en fonction de la taille des parties (Actuellement, 4MB) ?
- Balancer le fichier complet, puis les hashs détaillés dans tous les cas, et comparés toutes les parties du fichiers une-à-une ?
Ensuite, au niveau du hashage en lui-même : N'y a-t-il pas plus rapide et/ou plus adapté pour des petits buffers ? Avec un MD5 pour 4Ko de buffer, j'ai l'impression de sortir un tank pour tuer une mouche...
Et pour finir : Quelle taille de buffer est la plus adaptée, en prenant en compte le hashage ? Y'a-t-il un risque de pertes plus important avec une grosse requête TCP d'un coup, ou c'est juste une "superstition" de ma part ? S'il faut rester sur un petit buffer (4Ko), pourquoi ? En passant sur un plus gros (4MB par ex.), est-ce adapté niveau vitesse de transfert et hashes ?
Merci à vous pour votre aide, en espérant avoir été clair.
- PandiPanda
- Membre émérite

- Messages : 656
- Enregistré le : mar. 19 juil. 2011 14:03
- Localisation : Bruxelles
- Status : Hors ligne
Re: [..] Hashage de fichier par parties le plus rapide ?
Bonsoir,
perso pour un fichier de 148Mb je met ~4sec
avec ce code ci;
Je suppose que vous faite un "fileread()" pour recuperer les données + _Crypt_HashData() ce qui met probablement le plus longtemps a s'executer.
deplus, il est noter dans l'aide que _Crypt_Startup ( ) est optionnel, mais optimise les performances.
perso pour un fichier de 148Mb je met ~4sec
avec ce code ci;
► Afficher le texte
deplus, il est noter dans l'aide que _Crypt_Startup ( ) est optionnel, mais optimise les performances.
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
Re: [..] Hashage de fichier par parties le plus rapide ?
Bonsoir,
Je vois ça, mais votre code ne répond pas réellement à mes questions, puisque effectivement, le hash global du fichier est assez rapide, mais ce n'est pas mon intention, puisque je veux pouvoir re-télécharger rapidement la partie corrompue du fichier sans avoir à retélécharger le fichier en entier.
De plus, j'utilise effectivement _Crypt_StartUp() et _Crypt_Shutdown(), mais les temps d'exécution restent très lents. Pour le FileRead, côté serveur en effet, je le fais en lui passant le nombre d'octets du buffer en deuxième argument, et côté client je compare les données reçues avec le hash que le serveur fournit en même temps.
Je vois ça, mais votre code ne répond pas réellement à mes questions, puisque effectivement, le hash global du fichier est assez rapide, mais ce n'est pas mon intention, puisque je veux pouvoir re-télécharger rapidement la partie corrompue du fichier sans avoir à retélécharger le fichier en entier.
De plus, j'utilise effectivement _Crypt_StartUp() et _Crypt_Shutdown(), mais les temps d'exécution restent très lents. Pour le FileRead, côté serveur en effet, je le fais en lui passant le nombre d'octets du buffer en deuxième argument, et côté client je compare les données reçues avec le hash que le serveur fournit en même temps.
- jchd
- AutoIt MVPs (MVP)

- Messages : 2284
- Enregistré le : lun. 30 mars 2009 22:57
- Localisation : Sud-Ouest de la France (43.622788,-1.260864)
- Status : Hors ligne
Re: [..] Hashage de fichier par parties le plus rapide ?
Un peu plus rapide par trancexx.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Re: [..] Hashage de fichier par parties le plus rapide ?
Je l'avais vue, en effet, mais elle ne correspond pas à ce que je cherche puisqu'elle a besoin d'un fichier. Etant donné que je cherche à faire un hash du buffer, et donc de 4Ko/Mo uniquement, je ne peux pas m'en servir.
Pour ce qui est de mes autres questions, un avis ?
Merci pour votre aide.
Pour ce qui est de mes autres questions, un avis ?
Merci pour votre aide.
- jchd
- AutoIt MVPs (MVP)

- Messages : 2284
- Enregistré le : lun. 30 mars 2009 22:57
- Localisation : Sud-Ouest de la France (43.622788,-1.260864)
- Status : Hors ligne
Re: [..] Hashage de fichier par parties le plus rapide ?
Faudrait savoir.Je travaille en ce moment sur de l'envoi de fichiers par TCP
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Re: [..] Hashage de fichier par parties le plus rapide ?
Je maintiens, simplement :
Il s'agit d'un buffer, pas du fichier entier, en gros, un morceau de fichier est contenu dans une variable, donc il me faut un hash MD5 de ma variable $buffer, PAS du fichier entier...Je souhaite utiliser un buffer relativement petit (4096 bits) pour faciliter le transfert et éviter des erreurs potentielles. A l'arrivée du buffer sur le client, il teste avec un hash fourni par le serveur pour la partie envoyée, et s'il ne correspond pas, demande le réenvoi de la partie actuelle, autrement, il passe à la partie suivante.
- TommyDDR
- Modérateur

- Messages : 2128
- Enregistré le : mar. 22 juil. 2008 21:55
- Localisation : Nantes
- Status : Hors ligne
Re: [..] Hashage de fichier par parties le plus rapide ?
http://fr.wikipedia.org/wiki/Transmissi ... l_Protocol
Il me semble que le TCP vérifie déjà l'intégrité des données.
Vous n'avez donc pas besoin de comparer des hash, ils seront toujours identiques.
Il y a juste le @error à vérifier après un TCPSend, s'il est égal à 10035, il faut attendre un peu (10ms suffisent en général) et refaire le TCPSend.
Avec ça vous pouvez transférer un fichier aussi lourd que vous voulez en étant certains que les données reçues sont ok.
C'est ce que j'utilise depuis pas mal de temps et je n'ai jamais eu de soucis.
Il me semble que le TCP vérifie déjà l'intégrité des données.
Vous n'avez donc pas besoin de comparer des hash, ils seront toujours identiques.
Il y a juste le @error à vérifier après un TCPSend, s'il est égal à 10035, il faut attendre un peu (10ms suffisent en général) et refaire le TCPSend.
Avec ça vous pouvez transférer un fichier aussi lourd que vous voulez en étant certains que les données reçues sont ok.
C'est ce que j'utilise depuis pas mal de temps et je n'ai jamais eu de soucis.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Re: [..] Hashage de fichier par parties le plus rapide ?
Il y a bien la vérification sur les trames en CRC, oui, mais je me demandais si ça suffisait, vu que les téléchargements corrompus existent toujours (Qui n'a jamais téléchargé un fichier corrompu sur internet ?)...
Donc, théoriquement, si je vérifie bien le @error après chaque TCPSend, mon fichier ne devrait jamais arriver corrompu ? Voilà qui m'ôte une épine du pied...
Pour ce qui est de mes autres questions, en particulier sur la taille du buffer, que suggérez-vous ?
Merci pour vos informations.
Donc, théoriquement, si je vérifie bien le @error après chaque TCPSend, mon fichier ne devrait jamais arriver corrompu ? Voilà qui m'ôte une épine du pied...
Pour ce qui est de mes autres questions, en particulier sur la taille du buffer, que suggérez-vous ?
Merci pour vos informations.
- TommyDDR
- Modérateur

- Messages : 2128
- Enregistré le : mar. 22 juil. 2008 21:55
- Localisation : Nantes
- Status : Hors ligne
Re: [..] Hashage de fichier par parties le plus rapide ?
Je pense que je mieux c'est d'en essayer plusieurs et de mettre des timerinit / timerdiff 
Il me semble que la taille du buffer est à adapter en fonction du réseau, il n'y a pas de taille de buffer miracle.
Il me semble que la taille du buffer est à adapter en fonction du réseau, il n'y a pas de taille de buffer miracle.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Re: [..] Hashage de fichier par parties le plus rapide ?
Il n'y en a certainement pas de "miracles", mais quel avantage à utiliser des buffers plus ou moins gros ?
Et la taille des paquets TCP, quelle taille est "recommandable" ? Je vois pas mal de scripts avec 2Ko ou 4Ko...
Et la taille des paquets TCP, quelle taille est "recommandable" ? Je vois pas mal de scripts avec 2Ko ou 4Ko...
- TommyDDR
- Modérateur

- Messages : 2128
- Enregistré le : mar. 22 juil. 2008 21:55
- Localisation : Nantes
- Status : Hors ligne
Re: [..] Hashage de fichier par parties le plus rapide ?
Je dis peut être des bêtises mais je crois que :
Grosse connexion -> gros buffer (gros débit, pas grave si on perd un paquet)
Petite connexion -> petit buffer (petit débit donc on assure les paquets)
En fait, le TCP va envoyer la donnée, et une fois terminé, il attends un retour de son interlocuteur (donc vous perdez le temps d'un ping pour chaque paquet)
Donc plus les paquets sont gros, plus ça sera rapide, plus ils sont faible, plus la donnée à renvoyer sera petite et donc le temps perdu sera moindre.
Grosse connexion -> gros buffer (gros débit, pas grave si on perd un paquet)
Petite connexion -> petit buffer (petit débit donc on assure les paquets)
En fait, le TCP va envoyer la donnée, et une fois terminé, il attends un retour de son interlocuteur (donc vous perdez le temps d'un ping pour chaque paquet)
Donc plus les paquets sont gros, plus ça sera rapide, plus ils sont faible, plus la donnée à renvoyer sera petite et donc le temps perdu sera moindre.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
- orax
- Modérateur

- Messages : 1479
- Enregistré le : lun. 23 mars 2009 04:50
- Localisation : ::1
- Status : Hors ligne
Re: [..] Hashage de fichier par parties le plus rapide ?
T'es obsédé par la taille !RL77LUC a écrit :Et la taille des paquets TCP, quelle taille est "recommandable" ? Je vois pas mal de scripts avec 2Ko ou 4Ko...
Il y a des outils pour tester tout ça : https://www.raymond.cc/blog/network-ben ... ork-speed/
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)

