Titre: Algo en perl pour mettre a jour un dictionnaire bruteforce Posté par: alsch le 08 Mai 2013 à 22:05:03 Bonjour,
Ayant des petits problèmes de gestion de dictionnaires :/(dans le cadre des Cela permet de créer un plus gros dictionnaire(et plus complet) à partir de tout ceux que vous pouvez trouver a droite et a gauche en evitant les doublons dus au copié collé. C'est la première fois que je touche a du perl donc si vous avez des idées d'amélioration , je suis tout à fait preneur =). Je n'ai pas fini encore le code , je vais ajouter une fonction pour trier le dictionnaire par ordre alphabétique ou par taille. Et je dois aussi implémenter la gestion des Erreurs.La suite sera posté quand elle sera fini(Mais la pour le moment c'est deux semaines d'exams qui m'attende ...). Après une journée à s'arracher les cheveux à cause d'une erreur d'algo ca donne : Code: #!/usr/bin/perl Pour l'utilisation , il suffit de faire: ./dictionary_update.pl -u "nom_du_dictionnaire_a mettre_a_jour" "nom_du_dictionnaire_que_vous venez_de_trouver" Les mots de passes seront ajoutés à la fin de votre fichier. Titre: Re : Algo en perl pour mettre a jour un dictionnaire bruteforce Posté par: the lsd le 09 Mai 2013 à 16:02:35 J'ai eu exactement la même idée il y a quelques années.
J'ai jamais fini de coder le prog, mais sur le principe, je faisais pas un seul gros fichier, mais un par lettre de l'alphabet (+ caractères spéciaux), ça permettait d'aller plus vite pour la recherche de mots existants, et donc pour ajouter des nouveaux mots au dico. Enjoy The lsd Titre: Re : Algo en perl pour mettre a jour un dictionnaire bruteforce Posté par: alsch le 09 Mai 2013 à 21:23:30 Tu veux dire que le programme dispatchais les différents mots dans passe dans des 27 fichiers différents(alphabet et char spec) en fonction de la première lettre?
Je trouve ça vraiment intéressant. Je n'ai pas d'expérience dans la puissance des algo . Est ce que tu sais si l'ouverture de fichiers pompe sur le processeur et la mémoire ? Pour le moment pour deux fichiers de 50Mb(ce qui est assez conséquent pour un dictionnaire (environ 30 millions de mots de chaque cotés,j'avais calculé le nombre d'opération c'est de la folie ) en machine virtuelle ça me prendre 2 heures avec ce procédé codé en perl. Titre: Re : Algo en perl pour mettre a jour un dictionnaire bruteforce Posté par: Zitoune le 14 Mai 2013 à 02:02:32 Bonjour,
Je ne suis pas sûr de bien avoir saisi ton problème, mais à première vue (et vu les tailles envisagées), tu pourrais : - charger ton ancien dictionnaire en mémoire (dans une table de hash, par exemple) : Code: my %hash = (); Code: $hash{$mot} = undef; Ensuite, quelque chose comme : Code: foreach (sort { $a cmp $b } (keys %hash)) { Je n'ai rien testé et c'est brut de décoffrage, mais je pense que cela coûte grosso modo le temps de lecture des fichiers de départ (une fois chacun), le temps d'écriture du fichier résultat, et bien sûr le temps de trier une liste de 50M éléments (aucune idée de ce que cela représente en Perl), c'est-à-dire de l'ordre de quelques minutes. Je veux bien un retour sur ce point :) Pour parler de performances que je maîtrise mieux, je suis quasiment certain qu'un programme C utilisant qsort (quitte à passer un peu de temps à virer les entrées doubles après le tri au moment de l'écriture) remplit ce rôle en moins de 5 minutes. Dans tous les cas, 2 heures pour faire ça me semble astronomique. Petite remarque : la puissance de Perl permet de faire le tri avec à peu près n'importe quoi, on peut imaginer utiliser dans le foreach : Code: sort { length($a) <=> length($b) } (keys %hash) # pour faire le tri sur la longueur des chaînes Une fois le fichier trié, la recherche d'un mot par dichotomie est quasi instantanée si le fichier est en RAM (pour 30 M de lignes, il faut au pire 25 essais). Si les fichiers ne tiennent pas en RAM, il faut en effet commencer à ruser en les découpant suivant la première lettre, les 2 premières lettres, ou utiliser des fonctions de hashages de faible entropie (8 bits, par exemple). La dernière solution est fun, mais ça ne simplifie pas du tout l'élaboration des dictionnaires. Bref, tout ça pour dire que je ne suis pas certain d'avoir fait avancer le schimilibilillick. Titre: Re : Re : Algo en perl pour mettre a jour un dictionnaire bruteforce Posté par: _o_ le 14 Mai 2013 à 18:59:25 foreach (sort { $a cmp $b } (keys %hash)) { Vu que la fonction utilisée pour le tri est celle par défaut, ça peut être condensé : Code: foreach (sort keys %hash) { Titre: Re : Algo en perl pour mettre a jour un dictionnaire bruteforce Posté par: Zitoune le 14 Mai 2013 à 23:59:05 En effet, judicieuse remarque.
Cependant, je trouve ça un tantinet moins clair pour le lecteur, et j'ai toujours peur en Perl de faire des bêtises, vu que c'est assez permissif :wink: Titre: Re : Algo en perl pour mettre a jour un dictionnaire bruteforce Posté par: alsch le 16 Mai 2013 à 14:36:04 Merci de toutes vos réponse ,
Dès la fin de mes partiels je me remet au travail (pourquoi les exam sont toujours en même temps que les idées de projet :?) Je ferais les essais avec la hash table qui devrait être bcp moins lourd que ce que j'ai fait Et aussi avec du code C (j'avais pris perl parce que je n'avait jamais mis les pattes dans ce langage) Et je vais essayer d'exploser la barre des deux heures ;) ) J'ai hâte de me remettre au boulot. Merci encore =D Titre: Re : Algo en perl pour mettre a jour un dictionnaire bruteforce Posté par: Harthorn le 23 Mai 2013 à 17:04:36 Une autre solution serait de le faire en Bash:
Code: #! /bin/bash C'est quand même beaucoup plus simple! ;) Titre: Re : Re : Algo en perl pour mettre a jour un dictionnaire bruteforce Posté par: _o_ le 23 Mai 2013 à 18:02:02 C'est quand même beaucoup plus simple! ;) Franchement ? Code: cat $1 $2 | sort | uniq > dico_final Mais c'était bien essayé. Par contre, faut pas trop lancer ce genre de truc avec des fichiers de plusieurs gigas. Edit : pour les mauvaises langues, on peut aussi utiliser sort -u, mais je n'aime pas ces commandes qui font des choses qui n'ont rien à voir avec leur fonction de départ. |