[..] Hashage de fichier par parties le plus rapide ?
Posté : mer. 30 juil. 2014 20:24
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.