elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Generar palabras de la mejor manera.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Generar palabras de la mejor manera.  (Leído 6,564 veces)
NetJava

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Generar palabras de la mejor manera.
« en: 31 Marzo 2011, 12:18 pm »

Buenas,

Bueno la verdad es que ya he estado haciendo preguntas más o menos sobre el mismo tema del proyecto que me había planteado, y ahora llego a la conclusión de que tengo que abandonarlo. La idea era crear una tabla con todas las palabras posibles, y poner su SHA1 y su MD5. En su momento ya me enfrente a crear todas las posibilidades de palabras y era imposible por el tiempo. Bueno las ideas que se me ocurrieron y que hice.

1.- Como se creaban muchas palabras "inservibles" hice que el programa cogiera libros en .txt, los filtrase para quitar signos, y después guardaba las palabras obtenidas, todas servibles, aun que ya sabemos que una contraseña es compleja frente a una palabra normal. Y más si tenemos una palabra con acento, o con una letra en mayúscula, pero bueno...

2.- Volví a generar palabras aleatoriamente pero con Thread (bueno para ser más exactos cada función de la aplicación se hacía en Thread diferentes). Bueno la cuestión es que aunq empiece a generar por un lado palabras con 10 caracteres y 32 posibilidades en un hilo, y en otro palabras de 9 caracteres con 32 posibilidades los tiempos siguen siendo demasiado... Así que os pongo un ejemplo.

Bueno el bucle normal (para 6 caracteres en la palabra) seria "for(int a = 0; a < 32; a++)" etc... Lo que pense e hice fue el bucle de para 6 caracteres separarlo en 4 bucles, cada uno en thread diferente. Pero aun así es imposible, por que hablamos de millones...

Código
  1. public void GenerarDiccionario6_1(JLabel jlbl_0){
  2. DBManagementx DBM11 = new DBManagementx();
  3. String ContentCarac = "";
  4. String c1 = "";
  5. String c2 = "";
  6. String c3 = "";
  7. String c4 = "";
  8. String c5 = "";
  9. for(int a = 0; a < 10; a++){
  10. c1 = caracteres1[a];
  11. for(int e = 0; e < 15; e++){
  12. c2 = caracteres1[e];
  13. for(int i = 0; i < 32; i++){
  14. c3 = caracteres1[i];
  15. for(int o = 0; o < 32; o++){
  16. c4 = caracteres1[o];
  17. for(int u = 0; u < 32; u++){
  18. c5 = caracteres1[u];
  19. for(int A = 0; A < 32; A++){
  20. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  21. DBM11.fillTablex(ContentCarac, jlbl_0);
  22. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  23. ContentCarac = "";
  24. }
  25. }
  26. }
  27. }
  28. }
  29. }
  30. DBM11 = null;
  31. }
  32.  

Código
  1. public void GenerarDiccionario6_1_1(JLabel jlbl_0){
  2. DBManagementx DBM11 = new DBManagementx();
  3. String ContentCarac = "";
  4. String c1 = "";
  5. String c2 = "";
  6. String c3 = "";
  7. String c4 = "";
  8. String c5 = "";
  9. for(int a = 0; a < 10; a++){
  10. c1 = caracteres1[a];
  11. for(int e = 15; e < 32; e++){
  12. c2 = caracteres1[e];
  13. for(int i = 0; i < 32; i++){
  14. c3 = caracteres1[i];
  15. for(int o = 0; o < 32; o++){
  16. c4 = caracteres1[o];
  17. for(int u = 0; u < 32; u++){
  18. c5 = caracteres1[u];
  19. for(int A = 0; A < 32; A++){
  20. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  21. DBM11.fillTablex(ContentCarac, jlbl_0);
  22. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  23. ContentCarac = "";
  24. }
  25. }
  26. }
  27. }
  28. }
  29. }
  30. DBM11 = null;
  31. }
  32.  

Bueno pues os cuento un poco más. Esto aun así tarda mucho. Lo que se hace: a través de un hilo se ejecuta el bucle va al método donde se guarda en la BD, pero antes se coteja con lo que ya hay guardado en la BD, para que no se dupliquen palabras.

Se os ocurre algo para hacerlo mejor en cualquier sentido.

Muchas gracias y saludos.  :-\

P.D:
32 * 32 = 1024

32 * 32 * 32 = 32.768

32 * 32 * 32 * 32 = 1.048.576

32 * 32 * 32 * 32 * 32 = 33.554.432

32 * 32 * 32 * 32 * 32 * 32 = 1.073.741.824






En línea

NetJava

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: Generar palabras de la mejor manera.
« Respuesta #1 en: 31 Marzo 2011, 12:26 pm »

Bueno algo más. Cuanto hilos puede ejecutar a la vez¿? Pues para mi ordenador para que la aplicación "aguante" unos cuatro hilos aprox, el gadgets de la CPU con el primer hilo 25%, y así sucesivamente. Cuando digo que la aplicación "aguante" es por que cuanto más hilos pongo a rular en paralelo más fallos se producen al insertar en la BD. Aun q hasta 4 hilos es asequible por que se produce un error de 800 inserciones, teniendo en cuanta que con un solo hilo, no se produce ni un solo error. Para dar algo más de inf.

Saludos!!


En línea

KuraraGNU

Desconectado Desconectado

Mensajes: 209



Ver Perfil
Re: Generar palabras de la mejor manera.
« Respuesta #2 en: 31 Marzo 2011, 12:50 pm »

Ufff la verdad es que son muchisimos bucles, normal que tarde tanto, habria que cambiar por completo el planteamiento del ejercicio, manteniendo lo de buscar en el txt ese. No se, quizas usando una matriz de mas de una dimension? Me lo mirare en mi tiempo libre a ver si se me ocurre algo. Exactamente cuantos hilos tienes y que hace cada uno? Es que no me entero lo de los hilos e.e
En línea

NetJava

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: Generar palabras de la mejor manera.
« Respuesta #3 en: 31 Marzo 2011, 13:19 pm »

Buenas, pues muchas gracias, te voy a poner más inf.

Lo primero es decir que se crea un objeto thread para cada bucle. Al igual que hay un objeto diferente de conexión con la BD para cada bucle.

Código
  1. ...
  2. ...
  3. ...
  4. //este código esta dentro de la clase Thread, en un case dentro del método run()
  5. case 15:algoritx.GenerarDiccionario6_1(this.jlbl_0); break;
  6. case 16:algoritx.GenerarDiccionario6_1_1(this.jlbl_0); break;
  7. case 17:algoritx.GenerarDiccionario6_2(this.jlbl_0); break;
  8. case 18:algoritx.GenerarDiccionario6_2_1(this.jlbl_0); break;
  9. case 19:algoritx.GenerarDiccionario6_3(this.jlbl_0); break;
  10. case 20:algoritx.GenerarDiccionario6_3_1(this.jlbl_0); break;
  11. ...
  12. ...
  13. ...
  14. //algoritx el el objeto de la clase algoritmo donde se encuentran todos los bucles.
  15. public void GenerarDiccionario6_1(JLabel jlbl_0){
  16. DBManagementx DBM11 = new DBManagementx();
  17. String ContentCarac = "";
  18. String c1 = "";
  19. String c2 = "";
  20. String c3 = "";
  21. String c4 = "";
  22. String c5 = "";
  23. for(int a = 0; a < 10; a++){
  24. c1 = caracteres1[a];
  25. for(int e = 0; e < 15; e++){
  26. c2 = caracteres1[e];
  27. for(int i = 0; i < 32; i++){
  28. c3 = caracteres1[i];
  29. for(int o = 0; o < 32; o++){
  30. c4 = caracteres1[o];
  31. for(int u = 0; u < 32; u++){
  32. c5 = caracteres1[u];
  33. for(int A = 0; A < 32; A++){
  34. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  35. DBM11.fillTablex(ContentCarac, jlbl_0);
  36. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  37. ContentCarac = "";
  38. }
  39. }
  40. }
  41. }
  42. }
  43. }
  44. DBM11 = null;
  45. }
  46.  
  47. public void GenerarDiccionario6_1_1(JLabel jlbl_0){
  48. DBManagementx DBM11 = new DBManagementx();
  49. String ContentCarac = "";
  50. String c1 = "";
  51. String c2 = "";
  52. String c3 = "";
  53. String c4 = "";
  54. String c5 = "";
  55. for(int a = 0; a < 10; a++){
  56. c1 = caracteres1[a];
  57. for(int e = 15; e < 32; e++){
  58. c2 = caracteres1[e];
  59. for(int i = 0; i < 32; i++){
  60. c3 = caracteres1[i];
  61. for(int o = 0; o < 32; o++){
  62. c4 = caracteres1[o];
  63. for(int u = 0; u < 32; u++){
  64. c5 = caracteres1[u];
  65. for(int A = 0; A < 32; A++){
  66. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  67. DBM11.fillTablex(ContentCarac, jlbl_0);
  68. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  69. ContentCarac = "";
  70. }
  71. }
  72. }
  73. }
  74. }
  75. }
  76. DBM11 = null;
  77. }
  78.  
  79. public void GenerarDiccionario6_2(JLabel jlbl_0){
  80. DBManagementx DBM11 = new DBManagementx();
  81. String ContentCarac = "";
  82. String c1 = "";
  83. String c2 = "";
  84. String c3 = "";
  85. String c4 = "";
  86. String c5 = "";
  87. for(int a = 10; a < 20; a++){
  88. c1 = caracteres1[a];
  89. for(int e = 0; e < 15; e++){
  90. c2 = caracteres1[e];
  91. for(int i = 0; i < 32; i++){
  92. c3 = caracteres1[i];
  93. for(int o = 0; o < 32; o++){
  94. c4 = caracteres1[o];
  95. for(int u = 0; u < 32; u++){
  96. c5 = caracteres1[u];
  97. for(int A = 0; A < 32; A++){
  98. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  99. DBM11.fillTablex(ContentCarac, jlbl_0);
  100. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  101. ContentCarac = "";
  102. }
  103. }
  104. }
  105. }
  106. }
  107. }
  108. DBM11 = null;
  109. }
  110.  
  111. public void GenerarDiccionario6_2_1(JLabel jlbl_0){
  112. DBManagementx DBM11 = new DBManagementx();
  113. String ContentCarac = "";
  114. String c1 = "";
  115. String c2 = "";
  116. String c3 = "";
  117. String c4 = "";
  118. String c5 = "";
  119. for(int a = 10; a < 20; a++){
  120. c1 = caracteres1[a];
  121. for(int e = 15; e < 32; e++){
  122. c2 = caracteres1[e];
  123. for(int i = 0; i < 32; i++){
  124. c3 = caracteres1[i];
  125. for(int o = 0; o < 32; o++){
  126. c4 = caracteres1[o];
  127. for(int u = 0; u < 32; u++){
  128. c5 = caracteres1[u];
  129. for(int A = 0; A < 32; A++){
  130. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  131. DBM11.fillTablex(ContentCarac, jlbl_0);
  132. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  133. ContentCarac = "";
  134. }
  135. }
  136. }
  137. }
  138. }
  139. }
  140. DBM11 = null;
  141. }
  142.  
  143. public void GenerarDiccionario6_3(JLabel jlbl_0){
  144. DBManagementx DBM11 = new DBManagementx();
  145. String ContentCarac = "";
  146. String c1 = "";
  147. String c2 = "";
  148. String c3 = "";
  149. String c4 = "";
  150. String c5 = "";
  151. for(int a = 20; a < 32; a++){
  152. c1 = caracteres1[a];
  153. for(int e = 0; e < 15; e++){
  154. c2 = caracteres1[e];
  155. for(int i = 0; i < 32; i++){
  156. c3 = caracteres1[i];
  157. for(int o = 0; o < 32; o++){
  158. c4 = caracteres1[o];
  159. for(int u = 0; u < 32; u++){
  160. c5 = caracteres1[u];
  161. for(int A = 0; A < 32; A++){
  162. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  163. DBM11.fillTablex(ContentCarac, jlbl_0);
  164. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  165. ContentCarac = "";
  166. }
  167. }
  168. }
  169. }
  170. }
  171. }
  172. DBM11 = null;
  173. }
  174.  
  175. public void GenerarDiccionario6_3_1(JLabel jlbl_0){
  176. DBManagementx DBM11 = new DBManagementx();
  177. String ContentCarac = "";
  178. String c1 = "";
  179. String c2 = "";
  180. String c3 = "";
  181. String c4 = "";
  182. String c5 = "";
  183. for(int a = 20; a < 32; a++){
  184. c1 = caracteres1[a];
  185. for(int e = 15; e < 32; e++){
  186. c2 = caracteres1[e];
  187. for(int i = 0; i < 32; i++){
  188. c3 = caracteres1[i];
  189. for(int o = 0; o < 32; o++){
  190. c4 = caracteres1[o];
  191. for(int u = 0; u < 32; u++){
  192. c5 = caracteres1[u];
  193. for(int A = 0; A < 32; A++){
  194. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  195. DBM11.fillTablex(ContentCarac, jlbl_0);
  196. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  197. ContentCarac = "";
  198. }
  199. }
  200. }
  201. }
  202. }
  203. }
  204. DBM11 = null;
  205. }
  206. ...
  207. ...
  208. ...
  209. //Ahora se llama a al método fillTable (el nombre del método no importa jejeje). En este método se llama la otro que coteje primero.
  210. public void fillTable(String dato){
  211. if(Cotejar(dato) == 0){
  212. newCodigo();
  213. idpalabra +=1;
  214. String SQL = "INSERT INTO palabras (idpalabras, palabras, sha1, md5) Values ('" + idpalabra + "','" + dato + "', '', '');";
  215. try{
  216. st.executeUpdate(SQL);
  217. }catch(Exception e){
  218. e.printStackTrace();
  219. }
  220. }
  221. }
  222. ...
  223. ...
  224. ...
  225.  

Y este es el proceso. Lo importante esq se genera un objeto thread por cada bucle, y también para las conexiones. hay muchos bucles es verdad... para generar cadenas de 10 caracteres...

Lo que necesites! Gracias.
En línea

NetJava

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: Generar palabras de la mejor manera.
« Respuesta #4 en: 1 Abril 2011, 18:07 pm »

Buenas,

os pregunto unas cuantas cosas que son especificas y supongo que esos conocimientos los da la experiencia jejeje. Todo esto en cuanto a rendimiento de la aplicación.

1.- Que es mejor, crear un objeto y utilizar el mismo 4 veces o crear 4 objetos¿? Por ejemplo yo cuando lanzo hilos, por cada botón tengo un objeto de la clase hilo. A lo mejor debería crear una variable private instanciarla, y llamarla en los botones con el método necesario.

2.- Cuando se conecta a una base de datos, que resulta más eficiente, conectar una vez, ejecutar tus acciones y cerrar conexión. O mantener la conexión "abierta" para siempre que la necesitéis.

Esta aplicación puede llegar a saturar mi ordenador en cuanto más hilos ponga a rular, afectando a la CPU. Ya habéis visto como va, por el código. ¿Es normal que el ordenador se sature?

Muchas gracias y saludos!

Aun q ya es un poco tarde por que hace tiempo que estoy con este tema, intento ver hasta donde puedo llegar, aun q esto se tenía que hacer antes, pero bueno. 
En línea

NetJava

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: Generar palabras de la mejor manera.
« Respuesta #5 en: 4 Abril 2011, 17:18 pm »

Buenas,

pues nada os voy a poner hasta donde he llegado. He eliminado el método cotejar, que lo que hacía era comprobar si esa palabra ya existía. De esa manera me quito un acceso a la BD. Ahora solo se accede para insertar.

Para evitar que se dupliquen palabras inserto por orden, primero de 1 carácter, cuando acabe 2 caracteres, y así sucesivamente.

El proceso lo lanzo desde un thread, de esa manera tengo un "JLabel" que me va diciendo cuantos caracteres van siendo insertados. Ahora he añadido más caracteres para crear otra BD.

1) 44 = 44

2) 44 * 44 = 1936

3) 44 * 44 * 44 = 85184   

4) 44 * 44 * 44 * 44 = 3.748.096  ******

5) 44 * 44 * 44 * 44 * 44 = 164.916.224

6) 44 * 44 * 44 * 44 * 44 * 44 = 7.256.313.856

Cuando llegue a cantidades grandes modificaré los bucles para que haga la parte proporcional a un día. Al día siguiente o por la noche, lo dejare con la cantidad correspondiente.

No se si esto os sirve de algo. Pero me he dado cuenta que MySQL no hace distinciones entre:

a, á
....
u, ú
n, ñ
tampoco hace distinción entre mayúsculas y minúsculas.

Por lo que si busco en la BD "que", el resultado será:

que
qué
qúe
qúé

Seguiré con este tema formando la BD, si a alguien se le ocurre una idea, perfect.

Saludos, y espero que sirva la inf que he dejado.

En línea

KuraraGNU

Desconectado Desconectado

Mensajes: 209



Ver Perfil
Re: Generar palabras de la mejor manera.
« Respuesta #6 en: 12 Abril 2011, 14:48 pm »

Ya que me pierdo bastante con lo que intentas, se ve que no soy tan lista, te respondo esto, jeje:
1.- Que es mejor, crear un objeto y utilizar el mismo 4 veces o crear 4 objetos¿? Por ejemplo yo cuando lanzo hilos, por cada botón tengo un objeto de la clase hilo. A lo mejor debería crear una variable private instanciarla, y llamarla en los botones con el método necesario.
Hombre, ten en cuenta que a mas objetos creados, mas consumo de memoria, pero si controlas que dejas a un hilo en espera mientras se ejecuta otro el ordenador lo tendra mas facil a la hora de controlar los ciclos de tiempo.

2.- Cuando se conecta a una base de datos, que resulta más eficiente, conectar una vez, ejecutar tus acciones y cerrar conexión. O mantener la conexión "abierta" para siempre que la necesitéis. 
A mi siempre me han dicho que mejor que se cierre, no se :/.
En línea

NetJava

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: Generar palabras de la mejor manera.
« Respuesta #7 en: 12 Abril 2011, 19:06 pm »

Buenas,

muchas gracias por responder,  lo tendré en cuenta, llevo ya días generando. El tema de la memoria del ordena me rallaba bastante. Esta claro que tengo que mejorar el manejo con los objetos XD gracias. Justamente hoy pensando un poco se me ha ocurrido que las palabras que genere las podría ir guardando en un arraylist, en vez de generar una y guardar continuamente, y cuando haya llegado a 1 millón poner un hilo en paralelo a insertar en la base de datos, mientras que otro sigue generando palabras en otro arraylist, y cuando llegue a 1 millón pasarlo al hilo que inserta y reutilizar el hilo anterior. Creo que así podría ir más rápido... Voy a probarlo hoy XD

Un saludo y gracias!!!
En línea

NetJava

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: Generar palabras de la mejor manera.
« Respuesta #8 en: 13 Abril 2011, 19:03 pm »

Buenas,

bueno sigo preguntando o escribiendo para mi mismo jajjaja. He probado la idea que se me ocurrió ayer, y es increíblemente más rápido, y ahora es ese el problema, 1 millón se genera enseguida, entonces comienza un thread paralelo para hacer la inserción en la base de datos, la inserción se hace repetidamente dentro de un bucle... El bucle no se desborda, esta siempre limitado a 1 millón, pero va tan rápido que llega un momento en el que no para de generar excepciones. Se os ocurre alguna idea¿?

Gracias y saludos!!!
En línea

KuraraGNU

Desconectado Desconectado

Mensajes: 209



Ver Perfil
Re: Generar palabras de la mejor manera.
« Respuesta #9 en: 14 Abril 2011, 10:11 am »

pero va tan rápido que llega un momento en el que no para de generar excepciones. Se os ocurre alguna idea¿?

Gracias y saludos!!!
Que clase de excepciones? pega unas pocas aqui XD Ponle un sleep() si va muy rapido o un pause() o como se llame. Es que no se que metodo es el que esta deprecated y cual es el que hay que usar, tu me entiendes. Cuando lo hagas quedamos por msn y me explicas lo que estas haciendo que me gustaria saber como funcioa tu programa pero no lo pillo con tanto bucle o yo que se por que.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Mejor manera de restringir acceso?
PHP
19.5 5 2,140 Último mensaje 18 Diciembre 2007, 08:57 am
por WHK
¿Cuál es la mejor manera de rippear un dvd?
Multimedia
tubieja 3 3,448 Último mensaje 16 Agosto 2009, 13:54 pm
por Songoku
Generar horarios de laboratorios de manera automatica con asp .net
.NET (C#, VB.NET, ASP)
BMPichijar 1 3,293 Último mensaje 9 Septiembre 2011, 04:42 am
por Keyen Night
Problema de generar palabras aleatorias [URGENTE]
Java
IsmaelBFH 5 6,071 Último mensaje 12 Noviembre 2015, 16:18 pm
por PabloPbl
Generar palabras al azar en dev c++ a partir de un listado
Programación C/C++
creiko 1 3,702 Último mensaje 17 Junio 2016, 08:11 am
por class_OpenGL
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines