Sitio Migrado
He migrado este sitio acá ( Jorge Niedbalski , sitio web ) .
I have moved this website here ( Jorge Niedbalski, website )
Patrones : Cache Manager (PHP5)
Cuando :
Es un elemento crucial para cualquier aplicación que obtenga informacion de un centro de computo que tome tiempo en procesar una solicitud , lo anterior debido a que que se deben inicializar estructuras para mantener las copias de datos/buffers/ , generalmente inicializar un descriptor , sobre eso realizar la lógica del protocolo , solicitar el recurso, inicializar la transferencia y finalmente copiar en las estructuras previamente allocadas.
La solución mas simple es realizar una sola vez este proceso durante un periodo T , manteniendo esta información en algun backend accesible por el proceso sin necesidad de realizar nuevamente el costoso proceso descrito anteriormente de forma transparente para la aplicación.
Como :
Si los datos solicitados se encuentran en el cache ( hit ) , la solicitud será atendida leyendolo desde el caché, lo que acelerará el tiempo de respuesta. En el caso de que el dato solicitado no se encuentre, será solicitado a la fuente de datos en su ubicación original ( independiente del protocolo ) y almacenada en el caché intermedio. Del mismo modo, la siguiente solicitud para el mismo recurso será atendida desde el caché previamente almacenado.
Código:
Patrones : Observer (PHP5)
Cuando
Se utiliza cuando se tiene una arquitectura del tipo un productor a varios consumidores ( cliente-servidor ) , es la primitiva mas esencial del paso de mensajes, acoplamiento en una dirección y accionamiento jerarquico para un modelo de eventos.
Como
Funciones : dispersión [ Hash ]
Cada desarrollador debe conocer al menos una manera de identificar un elemento desde un vector utilizando un indice. Un indice es un puntero que “apunta” un objeto ya sea de un tipo de dato básico o algun elemento compuesto ( struct, map, otro vector).
Para un valor dado t se utiliza una funcion m tal que m genere una llave k que represente un indice en un vector o un slot de un array asociativo.
Dadas las limitaciones como espacio de direcciones disponibles en una computadora digital , es teoricamente imposible que para cada valor t de un conjunto potencialmente infinito , no existan colisiones para el mismo indice en el mismo slot.
Debido a este axioma la gran mayoria de los algoritmos que implementan tabla hash asumen la paradoja del cumpleaños implicando que a medida que aumentan los indices en la tabla. independiente de la uniformidad de la función de dispersión , la probabilidad de colisión aumenta linealmente.
Es por lo antes expuesto que es un requerimiento escencial para la funcion de dispersion proveer una distribución uniforme que garantice una baja cantidad de colisiones y un costo cercano a lineal para la resolución. Mas adelante iré describiendo algunas tecnicas para la resolución de colisiones en una tabla hash ( algunas estudiadas durante mi tesis de pregrado ).
Lo importante es que conozcamos al menos una función que distribuya valores no conocidos de tamaño-no acordado ( variable ) . Para el caso de valores conocidos es posible crear una tabla hash perfecta ( todos sus valores se distribuyen sin colisiones ) matematicamente es definida como injectiva.
Si cada elemento de entrada puede ocurrir con una probabilidad uniforme , como por ejemplo suponiendo que cada elemento del conjunto de entrada es un integro en el rango de 0 hasta N -1 , una buena funcion hash puede ser h = integro % n.
Para el caso de strings de tamaño variable , existen diferentes funciones para generar llaves que distribuyen relativamente bien en arquitecturas de 32 o 64 bits. La que utilizo con mayor frecuencia es la popular DJBX33X , propuesta por Daniel J. Bernstein . Tambien pueden guiarse por otras funciones de acuerdo a esta comparativa.
La funcion DJBX33X tiene algunas caracterizticas que la hacen única, en primer lugar por que se calcula muy rapido en procesadores i386 y en segundo lugar por que distribuye muy cercano a perfecto.
hash(i) = hash(i-1) * 33 + string[i]

