Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-07-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Componente Hashes, para quien pueda interesar

Hola,

He subido al Directorio del ClubDelphi un componente que he dado en llamar "Hashes" (en un alarde de ingenio e imaginación) y que puede usarse para calcular el algoritmo MD5 y SHA1 de una cadena, archivo o "Stream".

El componente se basa en la unidad "Hashes.pas" de Domingo Seoane y yo me he limitado a encapsular las funciones de la misma dentro de un componente, que a su vez añade una serie de eventos y algún que otro método.

Pensaba usar la unidad "Hashes.pas" del maestro Seoane, pero, para archivos "grandes", en mi caso, al menos, precisaba de un evento que me fuera informando del progreso de la tarea.

Ya puestos añadí algún otro evento y un método para poder "abortar" una tarea comenzada. Y eso es todo. Yo pienso usarlo en cierto proyecto, de modo que, si veo que son menester ciertos cambios, actualizaré el archivo del componente en consecuencia.

Otra cosa. "Hashes" puede usarse como una clase más, es decir, puede instalarse (incluye un paquete para Delphi 2007) o puede usarse como cualquier otra clase, no es necesario instalarlo, vaya.

Además incluyo un ejemplo de uso del componente, aunque, en el ejemplo he utilizado el componente instalado en Delphi, de modo que si queréis probarlo (con el ejemplo) tendréis que hacer lo propio. Pero en todo caso veréis que es relativamente sencillo hacer uso del mismo.

PD. Para archivos y "Streams" "pequeños" y cadenas... lo cierto es que tal vez ya no merezca la pena el uso del componente, y baste y sobre con usar la unidad "Hashes.pas" de Domingo Seoane.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 08-07-2007 a las 23:55:36.
Responder Con Cita
  #2  
Antiguo 09-07-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Muy bueno dec, lo dejaste perfecto.

Por cierto, para archivos grandes puede que sea mejor utilizar un buffer mayor. Por ejemplo:
Código Delphi [-]
GetMem(Buffer,1*1024*1024);
O incluso puedes dejar el tamaño del buffer como una propiedad mas del componente.
Responder Con Cita
  #3  
Antiguo 09-07-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Hum... pues no se me habría ocurrido Domingo.

¿Qué tamaño de "Buffer" crees tú válido "por defecto"?

Y otra más... ¿crees que sería bueno limitar el máximo del "buffer"? ¿Y el mínimo?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 09-07-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Vale... a la primera pregunta casi me respondo yo... un "buffer" de 1024 (que luego se multiplicará por diez) puede ser lo suyo "por defecto", puesto que así es como se establece en la unidad "Hashes.pas" de donde parte todo.

Ahora bien, ¿algún tipo de control para el mínimo y máximo del "buffer"? Lo digo para actualizar ya el componente o no.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 09-07-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Hombre, yo te recomendaría un tamaño de 1 mega (1024*1024) , o puede que medio mega (512*1024). En cuanto a limitar el máximo y el mínimo, es evidente que tiene que ser mayo de cero , y máximo lo que aguante, si alguien le coloca un tamaño demasiado grande simplemente provocara una excepción indicando que no hay memoria suficiente.
Responder Con Cita
  #6  
Antiguo 09-07-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

O sea, que esto no va bien, entonces:

Código Delphi [-]
GetMem(Buffer,10*FBuffer);

Siendo "FBuffer" 1024 (el valor por defecto).

Y no sé si ya esto sea una pasada... un par de instrucciones por debajo tenemos:

Código Delphi [-]
BytesRead:= Stream.Read(Buffer^, 10*FBuffer);

¿Me he pasado de listo Seoane?

Por ahora el "buffer" por defecto sería de 1024. No habría máximo y tampoco mínimo... se supone a quien lo toca que sabe lo que hace.

Edito: Sí que habría mínimo: el buffer ha de ser mayor que cero.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #7  
Antiguo 09-07-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Perfecto, veo que te diste cuenta de que otra instrucción había que cambiar.

Yo lo dejaría así:
Código Delphi [-]
GetMem(Buffer,FBuffer);
...
BytesRead:= Stream.Read(Buffer^, FBuffer);
Y limitaría el valor de FBuffer entre 1024 y 8*1024*1024, es decir entre 1KB y 8MB. Un rango bastante razonable.
Responder Con Cita
  #8  
Antiguo 09-07-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Sí; pero yo siento darte la brasa (nunca mejor dicho, acaso, por la calor que hace... al menos por aquí), pero, no me termino de aclarar, y es que, como se echa de ver, no estoy muy puesto en esto (como en casi nada).

¡A ver si me aclaro! Antes de toda esta movida había una instrucción tal que:

Código Delphi [-]
GetMem(Buffer,10*1024);

Entonces, mi sin duda superior intelecto había barruntado esto:

Código Delphi [-]
GetMem(Buffer,10*FBuffer);

La propiedad "Buffer" valdría por defecto 1024, y todo quedaría entonces "como antes".

Ahora bien, si decimos que la propiedad Buffer vale 1024 (por defecto), entonces la anterior instrucción no es lo mismo que esta:

Código Delphi [-]
GetMem(Buffer,FBuffer);

Entonces la propiedad "Buffer" tendría que valer, por defecto, 10024...

¿No? Pues me lo explica, por favor.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #9  
Antiguo 09-07-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
El tamaño del buffer es lo que esta dentro del GetMem. Tu te preguntaras por que utilizo 10*1024 y no 10240, pues siemplemente es una constumbre para distinguir a simple vista si son Kb, Mb, etc ...

En mi codigo utilizaba 10*1024 porque me parecio un tamaño razonable para una cadena de texto y archivos pequeños. Pero si se va a calcular algo realmente pequeño, puede utilizarse un buffer mas pequeño, y si vamos a calcular un archivo "grande" mejor un buffer mayor.

Lo que puedes hacer es esto otro:
Código Delphi [-]
GetMem(Buffer,FBuffer*1024);
De esta forma la propiedad FBuffer estaría en Kilobytes y seria mas fácil de manejar.
Responder Con Cita
  #10  
Antiguo 09-07-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Y se me olvidaba, según tienes el código, el tamaño del buffer determina cuando ocurre el evento OnWork. Cuanto mayor sea el buffer, los eventos OnWork serán menos y mas espaciados en el tiempo.
Responder Con Cita
  #11  
Antiguo 09-07-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Vale. Pues me convence esto que dices. He renombrado la propiedad "Buffer" a "KBBuffer"... esperando que así el asunto se entienda mejor. Entonces, entiendo ahora que un buen valor por defecto para esta propiedad podría ser 512... ¿O tal vez 1024?

¿Qué me dices?
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 09-07-2007 a las 01:21:27.
Responder Con Cita
  #12  
Antiguo 09-07-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Vaya... noto que si doy un valor a "KBBuffer" de 10 la aplicación se mueve mejor... no se atranca tanto, como si doy un valor de 1024 a dicha propiedad... de todos modos me he decidido por este último valor por defecto. Ya está también actualizado el invento. Gracias por todo Seoane.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como hacer un CD protegido para que no se pueda copiar federiconqn21 Varios 11 24-04-2007 05:52:07
Ofrecen 25 mdd para quien salve el planeta sakuragi La Taberna 11 12-02-2007 21:16:21
Como hacer para que un programa NO pueda ser cerrado desde el Task Manager? bustio Varios 6 25-05-2006 18:58:04
Para quien busque un curso de builder Picard C++ Builder 0 14-06-2004 00:06:04
Una pregunta para Kinobi o cualquier persona que pueda ayudar Markoz Firebird e Interbase 1 03-06-2003 19:51:18


La franja horaria es GMT +2. Ahora son las 10:13:19.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi