Generador de palabras. Wordgenerator.c
Hace tiempo, trasteando con las redes wifi y la clásica encriptacion WEP llegue a un punto en el que necesitaba una diccionario de claves. Como las claves eran ’semi-aleatorias’ no me servia cualquier diccionario, necesitaba algo que me generase todas las posibles claves de determinada longitud con un determinado juego de caracteres. Así que decidí poner en buen uso mis conocimientos de C y crearme una herramienta que me lo hiciera. El problema era conceptual mente simple así que me puse manos a la obra.
Inicialmente resolví el problema con recursividad (lento), mejorandolo mas tarde utilizando un algoritmo lineal (mucho mucho mas rápido). Aquí os dejo el código fuente.
Compilar
Si dispones de gcc el proceso es muy sencillo.
$ gcc -o wordgenerator.c wordgenerator
Ejecucion
Desde la linea de comandos basta con
$ ./wordgenerator
Código
//Librerias necesarias
#include<stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
//Prototipos
int getOptions(int,char**,char**,int*,int*);
void ayuda();
void generator(char *, char *,int, int);
//
//Funcion: wordgenerator.c
//Description: Genera palabras linear o recursivamente.
//Autor: Miggs
//Date: 18/10/2006
//
int main (int argc, char *argv[])
{
//Caracteres a usar por defecto
char *c = “1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM”;
int len;
//Usamos recursividad?
int r = 0; //No a no ser que nos lo pidan…if(getOptions(argc,argv,&c,&len,&r)<0)
ayuda();char actual[len + 1];
actual[len] = ‘\0′;if(r == 0){
//Lineal = rapido
int i,j;
for(i = 0; i < len ; i ++)
for(j = 0; j< strlen(c) ; j ++){
actual[i] = c[j];
printf(”%s\n”,actual);
}
}else
//Recursividad = lento
generator(c,actual,len,0);
return 0;
}
//
//Funcion: generator
//Description: funcion recursiva
//Date: 18/10/2006
//
void generator(char *c,char *actual, int len, int level)
{
int i;
if(level < len)
{
for(i = 0; i < strlen(c);i = i + 1){
actual[level] = c[i];
generator(c,actual,len,level+1);
}
}
else
printf(”%s\n”,actual);
}//
//Funcion: getOptions
//Description: Interpreta las opciones de la linea de comandos
//Date: 18/10/2006
//
int getOptions(int argc, char **argv, char **vC, int *l, int *r)
{
int c;
int retValue = -1;while((c = getopt(argc, argv, “l:c:r”)) != -1){
switch(c){
case ‘l’:
*l = atoi(optarg);
if(*l > 0)
retValue = 1;
break;
case ‘c’:
*vC =optarg;
break;
case ‘r’:
*r = 1;
default:
break;
}
}
return retValue;
}//
//Funcion: ayuda
//Description: Imprime la ayuda por pantalla
//Date: 18/10/2006
//
void ayuda()
{
printf(”\n// wordGenerator 0.1 6/Feb/2008\n”);
printf(”// icaix.com//\n”);
printf(”\n Uso:\n”)//
printf(” ./wordGenerator [-C CaracteresAUsar] [-r] -l <longitudPalabra> \n”);
printf(”\n Generacion palabras de longitud 3, metodo lineal\n”);
printf(” ./wordGenerator -l 3\n”);
printf(”\n Generacion palabras de longitud 3, metodo recursivo\n”);
printf(” ./wordGenerator -r -l 3\n”);
printf(” Generacion palabras de longitud 3 con vocabulario abcdefghABCDEFGH\n”);
printf(” ./wordGenerator -l 3 -C abcdefghABCDEFGH\n\n”);
_exit(0);
}
No siempre se encuentran los diccionarios que uno necesita.
Les comento dos herramientas que me sirven mucho
la primera, una antiquisima herramienta de unix
uniq
Quitas las palaras repetidas de un texto.
Y la siguiente es una que desarrolle, cuando necesite un diccionario, de claves que sean fechas, ya que muchas personas, utilizan fechas de cumpleanos.
#!/bin/bash
# Escrito por Lord Epzylon
# Dedicado a mi abuela
for d in `seq 1 31`;
do
echo $d >> dias;
done
for m in `seq 1 12`;
do
echo $m >> meses;
done
for a in `seq 1900 2008`;
do
echo $a >> anos;
done
for i in `cat anos`;
do
for u in `cat meses`;
do
for y in `cat dias`;
do
echo $y$u$i >> fechastodas;
done;
done;
done
Muy buena la pagina!
Gracias Epzylon,
No hay nada mejor que tener alternativas!
Saludos