J'utilise actuellement md5_file () code> pour parcourir environ 15 URL et vérifier leurs hachages MD5. Y a-t-il un moyen de faire cela plus vite? Il faut beaucoup trop de temps pour courir à travers tous. P>
8 Réponses :
L'algorithme MD5 est à peu près aussi rapide que possible et récupérer des URL est à peu près aussi rapide que possible (ralentir si les fichiers sont énormes ou que vous avez une connexion lente). Donc non. Vous ne pouvez pas le rendre plus rapide. P>
Bien évidemment, vous ne pouvez rien faire avec md5_file () code> pour faire plus vite, vous pouvez utiliser quelques
... Bien sûr, quelques micro-optimisations pourraient se raser 2 millisecondes de son runtime. Peut-être. Ou il pouvait simplement tirer les URL en parallèle et économiser quelques secondes. "Micro-optimisations" ne vaut presque jamais l'effort.
@Frank, ceci a été affiché avant la modification de la question pour inclure le code en question (qui, jusqu'à ce que, jusqu'à ce que le code ait été ajouté, on demande essentiellement comment accélérer MD5_File ()).
non. Comme il s'agit d'une fonction intégrée, il n'y a aucun moyen de le rendre plus rapide. P>
Mais si votre code télécharge des fichiers avant de les md5ing, il peut être possible d'optimiser vos téléchargements pour être plus rapides. Vous pouvez également voir une augmentation de vitesse en définissant la taille du fichier (à l'aide de Ftruncate) avant de l'écrire si vous connaissez la taille à l'avance. P>
En outre, si les fichiers sont suffisamment petits pour rester en mémoire et que vous les avez déjà en mémoire (car ils ont été téléchargés ou sont en cours de lecture pour une autre fin), vous pouvez utiliser MD5 code> Pour fonctionner sur elle en mémoire plutôt que
md5_file code> qui nécessite qu'elle soit à nouveau lue sur le disque. P>
Probablement vous le faites séquentiellement en ce moment. C'est à dire. Fetch Data 1, Données de processus1, Fetch Data 2, Données de processus 2, ... et le goulot d'étranglement peut être le transfert de données.
Vous pouvez utiliser curl_multi_exec () pour parallementer un peu .
Soit enregistrer un curlopt_writfunction et traiter chaque morceau de données (délicat puisque MD5 () fonctionne exactement un morceau de données).
Ou vérifier les poignées de courbure déjà terminées, puis traiter les données de cette poignée.
EDIT: Edition rapide et sale à l'aide de Extension de hachage (qui fournit des fonctions pour les hachages incrémentielles) et un Fermeture PHP5.3 + a>: p> (n'ai pas vérifié les résultats cependant ... ce n'est qu'un point de départ) p> p>
+1. La parallélisation des téléchargements est probablement une énorme victoire ici. Vous pouvez également parlementer la partie MD5 également, soit à l'aide de la commande md5sum code> cli (par exemple,
EXEC ('Bash -C "Fichier MD5Sum1> File1.md5 &"') code> ), ou en utilisant quelque chose comme PHP's PCNTL_FORK () à plusieurs appels à plusieurs appels à MD5_SUM (). Celles-ci ont à la fois leurs inconvénients, mais dans le bon contexte, ils peuvent être la meilleure chose à faire.
Et je dois admettre que je n'ai même pas testé si le téléchargement continue vraiment pendant que le rappel est exécuté. Mais puisque les portions de données sont supposées petites, j'espère que cela n'a pas d'importance (beaucoup).
Vous vérifiez probablement les mêmes URL sur une période de temps? Pourriez-vous vérifier les derniers en-têtes modifiés pour l'URL? Si la page en cours de vérification n'a pas changé, il n'y aurait pas besoin de ré-calculer le MD5. P>
Vous pouvez également demander aux pages de manière asynchrone afin de pouvoir être traitées en parallèle, plutôt que dans la série, ce qui devrait accélérer. p>
La vitesse de l'algorithme MD5 est linéaire. Plus l'entrée, plus il faudra de temps, plus si le fichier est grand, il n'y a pas grand chose que vous puissiez faire, vraiment. P>
Maintenant, comme Volkerk déjà suggéré, le problème n'est probablement pas le hasard MD5, mais la récupération et la lecture du fichier sur le net. P>
Je vois une très bonne suggestion d'optimiser ici a>. Cela fonctionnera bien surtout pour les gros fichiers, où MD5_File lit le fichier et cette fonction comparaisse simplement le deuxième octet de chaque fichier. P>
Expliquer ce que vous voulez faire aiderait. au cas où vous souhaitez vérifier un fichier avec leurs hachages MD5: strong> p>
Ce n'est pas une méthode sécurisée car il est sujet à attaque de collision . Vous devez utiliser plusieurs hachages (peut-être en divisant le fichier) ou en utilisant d'autres méthodes de hachage. P>
"Courez environ 15 URL" signifie quelque chose comme
md5_file ('http: //some.url/foo') code> dans une boucle avec 15 URL différentes? Quelle est la taille de ces "fichiers"?
Oui, c'est exactement ça. Je les tire dans une base de données MySQL puis les exécuter dans md5_file ($ Résultat) dans une boucle. Les fichiers sont très petits et n'ont en effet aucune sortie d'affichage, pas d'interface utilisateur, juste une page blanche vierge lors de la visualisation
La question est que vous calculez les hachages en séquence plutôt qu'en parallèle;
md5_file code> n'est pas le goulot d'étranglement. De plus, le hachage d'un fichier vide va-t-être toujours être le même.
Le hash changera si le fichier change.
md5_file () en soi est lent. Il faut 0,4 sec pour renvoyer le MD5 pour un fichier de 70 Ko.