<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Jorge Niedbalski R : Another boring unix programmer.</title>
	<atom:link href="http://niedbalski.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://niedbalski.wordpress.com</link>
	<description>Jorge Niedbalski R.</description>
	<lastBuildDate>Fri, 25 Mar 2011 15:00:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='niedbalski.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Jorge Niedbalski R : Another boring unix programmer.</title>
		<link>http://niedbalski.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://niedbalski.wordpress.com/osd.xml" title="Jorge Niedbalski R : Another boring unix programmer." />
	<atom:link rel='hub' href='http://niedbalski.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Sitio Migrado</title>
		<link>http://niedbalski.wordpress.com/2010/10/13/sitio-migrado/</link>
		<comments>http://niedbalski.wordpress.com/2010/10/13/sitio-migrado/#comments</comments>
		<pubDate>Wed, 13 Oct 2010 21:44:58 +0000</pubDate>
		<dc:creator>niedbalski</dc:creator>
				<category><![CDATA[Databases]]></category>

		<guid isPermaLink="false">http://niedbalski.wordpress.com/?p=80</guid>
		<description><![CDATA[He migrado este sitio acá ( Jorge Niedbalski , sitio web ) . I have moved this website here ( Jorge Niedbalski, website )<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niedbalski.wordpress.com&amp;blog=1553388&amp;post=80&amp;subd=niedbalski&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>He migrado este sitio acá ( <a href="http://www.niedbalski.org">Jorge Niedbalski</a> , sitio web ) .</p>
<p>I have moved this website here ( <a href="http://www.niedbalski.org">Jorge Niedbalski</a>, website )</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/niedbalski.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/niedbalski.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/niedbalski.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/niedbalski.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/niedbalski.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/niedbalski.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/niedbalski.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/niedbalski.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/niedbalski.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/niedbalski.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/niedbalski.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/niedbalski.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/niedbalski.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/niedbalski.wordpress.com/80/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niedbalski.wordpress.com&amp;blog=1553388&amp;post=80&amp;subd=niedbalski&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://niedbalski.wordpress.com/2010/10/13/sitio-migrado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86a2b6008a45ae3fdccec294f5a75c7c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">niedbalski</media:title>
		</media:content>
	</item>
		<item>
		<title>Patrones : Cache Manager (PHP5)</title>
		<link>http://niedbalski.wordpress.com/2010/05/24/patrones-cache-manager-php5/</link>
		<comments>http://niedbalski.wordpress.com/2010/05/24/patrones-cache-manager-php5/#comments</comments>
		<pubDate>Mon, 24 May 2010 18:10:48 +0000</pubDate>
		<dc:creator>niedbalski</dc:creator>
				<category><![CDATA[Patterns]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[cache manager pattern]]></category>
		<category><![CDATA[cache manager php5]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[pattern cache]]></category>
		<category><![CDATA[php5 memcache cache]]></category>

		<guid isPermaLink="false">http://niedbalski.wordpress.com/?p=65</guid>
		<description><![CDATA[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 , [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niedbalski.wordpress.com&amp;blog=1553388&amp;post=65&amp;subd=niedbalski&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Cuando :</strong></p>
<p>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. </p>
<p>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.</p>
<p><strong>Como :</strong></p>
<p>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.</p>
<div id="attachment_69" class="wp-caption aligncenter" style="width: 464px"><a href="http://niedbalski.files.wordpress.com/2010/05/grand8fig21.gif"><img src="http://niedbalski.files.wordpress.com/2010/05/grand8fig21.gif?w=454&#038;h=280" alt="" title="grand8fig2" width="454" height="280" class="size-full wp-image-69" /></a><p class="wp-caption-text">Cache Manager Design Pattern</p></div>
<p><strong>Código:</strong></p>
<p><span id="more-65"></span></p>
<p>La implementación utiliza adicionalmente un patrón Factory para obtener una instancia dependiendo del tipo de backend seleccionado , tambien utiliza un patrón singleton en vista de asegurar la existencia de una sola instancia en un ciclo de ejecucción.</p>
<pre class="brush: php;">
&lt;?php

/*
* Partial implementation of a Cache Manager Pattern for general use.
*
* @author Jorge Niedbalski R.
* @(#)Data::Cache::CacheManager
*
*/

class   CacheObjectException extends Exception {}
class   CacheObject {

    private    $is_url;
    private $keyname;
    private $lifetime;
    private $value;
    private $backend;

    public  function    __construct($backend = NULL, $keyname, $value, $lifetime, $is_url = FALSE)
    {
                $this-&gt;backend  = $backend;
                $this-&gt;keyname  = $keyname;
                $this-&gt;value    = $value;
                $this-&gt;lifetime = $lifetime;
                $this-&gt;is_url   = TRUE;
        }

        public  function    __destruct()  {}

        public  function getKeyName()
        {
            return ( $this-&gt;keyname );
        }   

        public  function    getLifeTime()
        {
            return ( $this-&gt;lifetime );
        }

        public  function    getValue()
        {
            if($this-&gt;is_url) {
                $this-&gt;value = file_get_contents($this-&gt;keyname);
                if($http_response_header[0] != 'HTTP/1.1 200 OK') {
                    throw new CacheObjectException(sprintf(&quot;Invalid response from resource %s&quot;, $this-&gt;keyname));
                }
            }
            return ( $this-&gt;value );
        }

        public  function    getBackend()
        {
            return ( $this-&gt;backend );
        }

        public    function    isURL()
        {
            return    ( $this-&gt;is_url );
        }

        public  function    setBackend($backend)
        {
            $this-&gt;backend = $backend;
        }

        public  function    setKeyName($name, $url = FALSE)
        {
            $this-&gt;keyname = $name;
        }

        public    function    setIsURL($is_url = FALSE)
        {
            $this-&gt;is_url = $is_url;
        }

        public  function    setLifeTime($lifetime)
        {
            $this-&gt;lifetime = $lifetime;
        }

        public  function    setValue($value)
        {
            $this-&gt;value    = $value;
        }

        public  function    fetch()
        {
            try {
                return ( CacheManager::fetchObject($this) );
            } catch(CacheManagerException $e) {
                throw new CacheObjectException($e-&gt;getMessage());
            }
        }
    }

    class   CacheBackendFactoryException extends Exception {}
    class   CacheBackendFactory
    {
       protected static $_instance; //single instance for each backend on the same execution time

       public   static  function    getInstance($backend)
       {
            if(self::$_instance == NULL) {
                $backend_class = sprintf(&quot;%sBackend&quot;, $backend);
                $backend_file  = sprintf(&quot;%s/Backends/%s.php&quot;, dirname(__FILE__), $backend_class);

                if(!file_exists($backend_file)) {
                    throw new CacheBackendFactoryException(sprintf(&quot;File %s not found on available backend classes\n&quot;, $backend_file));
                }

                require_once($backend_file);
                self::$_instance = new $backend_class();
            }

            return ( self::$_instance );
        }
    }

    class   CacheException extends Exception {}
    class   Cache {

         public static  function    fetchObject(CacheObject $object)
         {
            try {
                    return ( CacheBackendFactory::getInstance($object-&gt;getBackend())-&gt;fetchObject($object) );
            } catch(CacheBackendFactoryException $e) {
                throw new CacheException($e-&gt;getMessage());
            } catch(CacheBackendException $e) {
                throw new CacheException($e-&gt;getMessage());
            }
         }

         public static  function    addObject(CacheObject $object)
         {
            try  {
                    return ( CacheBackendFactory::getInstance($object-&gt;getBackend())-&gt;saveObject($object) );
            } catch(CacheBackendFactoryException $e) {
                throw new CacheException($e-&gt;getMessage());
            } catch(CacheBackendException $e) {
                throw new CacheException($e-&gt;getMessage());
            }
         }
    }

    class   CacheManagerException extends Exception {}
    class   CacheManager {

        public static   function    fetchObject(CacheObject $object)
        {
            try {
                return ( Cache::fetchObject($object) );
            } catch(CacheException $e) {
                throw new CacheManagerException($e-&gt;getMessage());
            } catch(ObjectKeyNotFoundException $e) {
                try {
                    return ( Cache::addObject($object) );
                } catch(ObjectCreaterException $e) {
                    throw new CacheManagerException($e-&gt;getMessage());
                } catch(CacheException $e) {
                    throw new CacheManagerExeption($e-&gt;getMessage());
                }
            }
        }
    }

    interface   Interface_CacheBackend {
        public  function    fetchObject(CacheObject $object);
        public  function    saveObject(CacheObject $object);
    }
?&gt;
</pre>
<p>Una implementación de Backend , ha sido realizada utilizando <a href="http://memcached.org/">Memcached</a> como centro de almacenamiento en un esquema llave-valor (debes tener instalada la extensión <a href="http://pecl.php.net/package/memcache">Pecl Memcache</a> ) :</p>
<pre class="brush: php;">

&lt;?php

define(MEMCACHE_HOST, '127.0.0.1');
define(MEMCACHE_PORT, 11211);

class	ObjectKeyNotFoundException extends Exception {}
class	CacheBackendException	extends Exception {}

class	MemcacheBackend implements Interface_CacheBackend {

		private	$conn;

		public	function	__construct()
		{
			$this-&gt;conn = new Memcache();
			$this-&gt;conn-&gt;connect(MEMCACHE_HOST, MEMCACHE_PORT);
		}

		public	function	fetchObject(CacheObject $object)
		{
			if( ($data = $this-&gt;conn-&gt;get($object-&gt;getKeyName()) ) == FALSE ) {
				throw new ObjectKeyNotFoundException();
			} else {
				return ( $data );
			}
		}

		public	function	saveObject(CacheObject $object)
		{
			if ( $this-&gt;conn-&gt;set($object-&gt;getKeyName(), $object-&gt;getValue(), 0, $object-&gt;getLifeTime()) ) {
				return ( $object-&gt;getValue() );
			}

			throw new CacheBackendException(&quot;Cannot save cache key %s&quot;, $object-&gt;getKeyName());
		}

}

?&gt;
</pre>
<p><strong> Otros </strong></p>
<p>Es un patrón de uso cotidiano para cualquier programador que se interese en el rendimiento de su aplicación. Es importante que sea usado con un backend que asegure un buen tiempo de respuesta.</p>
<p><strong>Referencias </strong></p>
<p><a href="http://en.wikipedia.org/wiki/Cache">Caché</a><br />
<a href="http://pecl.php.net/package/memcache">Pecl Memcache</a> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/niedbalski.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/niedbalski.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/niedbalski.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/niedbalski.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/niedbalski.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/niedbalski.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/niedbalski.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/niedbalski.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/niedbalski.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/niedbalski.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/niedbalski.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/niedbalski.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/niedbalski.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/niedbalski.wordpress.com/65/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niedbalski.wordpress.com&amp;blog=1553388&amp;post=65&amp;subd=niedbalski&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://niedbalski.wordpress.com/2010/05/24/patrones-cache-manager-php5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86a2b6008a45ae3fdccec294f5a75c7c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">niedbalski</media:title>
		</media:content>

		<media:content url="http://niedbalski.files.wordpress.com/2010/05/grand8fig21.gif" medium="image">
			<media:title type="html">grand8fig2</media:title>
		</media:content>
	</item>
		<item>
		<title>Patrones : Observer (PHP5)</title>
		<link>http://niedbalski.wordpress.com/2010/05/23/patrones-observer-php5/</link>
		<comments>http://niedbalski.wordpress.com/2010/05/23/patrones-observer-php5/#comments</comments>
		<pubDate>Sun, 23 May 2010 23:18:31 +0000</pubDate>
		<dc:creator>niedbalski</dc:creator>
				<category><![CDATA[Patterns]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[multi site post]]></category>
		<category><![CDATA[observer pattern]]></category>
		<category><![CDATA[observer twitter post]]></category>
		<category><![CDATA[patron observador]]></category>
		<category><![CDATA[streams]]></category>
		<category><![CDATA[stream_context twitter]]></category>

		<guid isPermaLink="false">http://niedbalski.wordpress.com/?p=49</guid>
		<description><![CDATA[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 Código En este caso utilizaremos la capa de abstracción de streams de PHP5 para [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niedbalski.wordpress.com&amp;blog=1553388&amp;post=49&amp;subd=niedbalski&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Cuando</strong></p>
<p>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.</p>
<p><strong>Como</strong></p>
<p><a href="http://niedbalski.files.wordpress.com/2010/05/800px-observer-svg.png"><img src="http://niedbalski.files.wordpress.com/2010/05/800px-observer-svg.png?w=300&#038;h=124" alt="" title="800px-Observer.svg" class="alignnone size-medium wp-image-53" width="300" height="124" /></a></p>
<p><span id="more-49"></span></p>
<p><strong> Código </strong></p>
<p>En este caso utilizaremos la capa de abstracción de <a href="http://cl.php.net/STREAM">streams de PHP5 </a> para desplegar un ejemplo de la implementación de este patrón.</p>
<pre class="brush: php;">
&lt;?php
/**
* PHP5 Observer pattern
*
* @author Jorge Niedbalski R.
* @(#)Data::Observer
*
**/
define('DEFAULT_SOCKET_TIMEOUT', 30);

class   SubjectException extends Exception {}
class   Subject {

    private $observerCollection = array();

    public  function    registerObserver(Observer $observer)
    {
        $object_hash = spl_object_hash($observer);

        if(array_key_exists($object_hash, $this-&gt;observerCollection) == TRUE) {
            throw new SubjectException(&quot;Object %s already exists\n&quot;, $object_hash);
        }

        $this-&gt;observerCollection[$object_hash] = $observer;
        return ( TRUE );
    }

    public  function    unregisterObserver(Observer $observer)
    {
         unset($this-&gt;observerCollection[spl_object_hash($observer)]);
    }

    public  function    notifyObservers($message)
    {
        foreach($this-&gt;observerCollection as $key =&gt; $registered_observer) {
            $registered_observer-&gt;notify($message);

        }
    }

}

class  Observer {
    public  function    notify($message) {
        $context = stream_context_create(array(
            'http' =&gt; array(
                            'method' =&gt; 'POST',
                            'header' =&gt; sprintf(&quot;Authorization: Basic %s\r\nContent-type: application/x-www-form-urlencoded\r\n&quot;, base64_encode(sprintf(&quot;%s:%s&quot;, $this-&gt;username, $this-&gt;password))),
                            'content'=&gt; http_build_query(array('status' =&gt; $message)),
                            'timeout'=&gt; DEFAULT_SOCKET_TIMEOUT,
                      ),
            )
        ); 

        file_get_contents($this-&gt;endpoint, FALSE,$context);
    }
}

class   TwitterObserver  extends Observer {
        public  function    __construct() {
            $this-&gt;endpoint = &quot;http://twitter.com/statuses/update.xml&quot;;
            $this-&gt;username = &quot;ikslabdein&quot;;
            $this-&gt;password = &quot;foobar&quot;;
        }
}

class   OtherObserver extends Observer {
        public  function    __construct() {
            $this-&gt;endpoint = &quot;http://other.service.com/update.xml&quot;;
            $this-&gt;username = &quot;foobar&quot;;
            $this-&gt;password = &quot;bafoor&quot;;
        }

}

$subject  = new Subject();

$subject-&gt;registerObserver(new TwitterObserver());
$subject-&gt;notifyObservers(&quot;I am Testing observer pattern, yeah !@#&quot;);

?&gt;
</pre>
<p><strong>Otros</strong></p>
<p>El ejemplo describe un patrón de observer en PHP5 para hacer POST via HTTP de un dato a multiples destinos. Puede ser ampliable a multiples stream asincronos o a algún otro protocolo implementado como <a href="http://cl.php.net/manual/en/class.streamwrapper.php">stream wrapper.</a>.</p>
<p><strong>Referencias</strong><br />
<a href="http://en.wikipedia.org/wiki/Observer_pattern">Wikipedia- Observer Pattern</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/niedbalski.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/niedbalski.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/niedbalski.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/niedbalski.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/niedbalski.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/niedbalski.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/niedbalski.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/niedbalski.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/niedbalski.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/niedbalski.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/niedbalski.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/niedbalski.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/niedbalski.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/niedbalski.wordpress.com/49/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niedbalski.wordpress.com&amp;blog=1553388&amp;post=49&amp;subd=niedbalski&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://niedbalski.wordpress.com/2010/05/23/patrones-observer-php5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86a2b6008a45ae3fdccec294f5a75c7c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">niedbalski</media:title>
		</media:content>

		<media:content url="http://niedbalski.files.wordpress.com/2010/05/800px-observer-svg.png?w=300" medium="image">
			<media:title type="html">800px-Observer.svg</media:title>
		</media:content>
	</item>
		<item>
		<title>Funciones : dispersión [ Hash ]</title>
		<link>http://niedbalski.wordpress.com/2010/05/13/hash-tables-dilema/</link>
		<comments>http://niedbalski.wordpress.com/2010/05/13/hash-tables-dilema/#comments</comments>
		<pubDate>Thu, 13 May 2010 05:00:42 +0000</pubDate>
		<dc:creator>niedbalski</dc:creator>
				<category><![CDATA[Functions]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[dispersion]]></category>
		<category><![CDATA[DJ33X]]></category>
		<category><![CDATA[funciones]]></category>
		<category><![CDATA[tablas hash]]></category>

		<guid isPermaLink="false">http://niedbalski.wordpress.com/?p=25</guid>
		<description><![CDATA[Cada desarrollador debe conocer al menos una manera de identificar un elemento desde un vector utilizando un indice. Un indice es un puntero que &#8220;apunta&#8221; 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 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niedbalski.wordpress.com&amp;blog=1553388&amp;post=25&amp;subd=niedbalski&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Cada desarrollador debe conocer al menos una manera de identificar un elemento desde un vector utilizando un indice. Un indice es un puntero que &#8220;apunta&#8221; un objeto ya sea de un tipo de dato básico o algun elemento compuesto ( struct, map, otro vector).</p>
<p>Para un valor dado <strong><em>t</em></strong> se utiliza una funcion <strong><em>m</em></strong> tal que <strong><em>m</em></strong> genere una llave <strong><em>k</em></strong> que represente un indice en un vector o un slot de un array asociativo.</p>
<p>Dadas  las limitaciones como espacio de direcciones disponibles en una computadora digital , es teoricamente imposible que para cada valor <strong><em>t</em></strong> de un conjunto potencialmente infinito , no existan colisiones para el mismo indice en el mismo slot.</p>
<p>Debido a este axioma la gran mayoria de los algoritmos que implementan tabla hash asumen la <a href="http://en.wikipedia.org/wiki/Birthday_paradox">paradoja del cumpleaños</a> 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.</p>
<p>Es por lo antes expuesto que es un requerimiento escencial para la funcion de dispersion proveer una<strong> distribución uniforme </strong>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 ).</p>
<p>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.</p>
<p>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 <code> h = integro % n</code>.</p>
<p>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 <a href="http://cr.yp.to/">Daniel J. Bernstein </a>. Tambien pueden guiarse por otras funciones de acuerdo a <a href="http://burtleburtle.net/bob/hash/evahash.html">esta comparativa</a>.</p>
<p>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.</p>
<p><code>hash(i) = hash(i-1) * 33 + string[i] </code></p>
<p><span id="more-25"></span></p>
<p>Las razones de por que se escoge el numero 33 como constante son explicadas por<a href="http://cvs.ossp.org/getfile/ossp-pkg/act/act_hash_fct.c"> Ralf S. Engelschall </a> , sabiendo que este fue escogido como la función hash de PHP ( No es menor , comprendiendo que PHP basa sus GST y otras funcionalidades del lenguaje en tablas de dispersion).</p>
<p>Si experimentalmente se prueban todos los multiplos entre 1 y 256 se detectan que no todos los numeros pares funcionan bien, a diferencia los numeros impares funcionan igual o mejor. En particular el numero 33 no tiene nada de especial por sobre otros buenos numeros con excepcion de que su operacion de multiplicacón puede ser reemplazada por un solo desplazamiento más una operacion de suma o resta.</p>
<p>Ejemplo de implementación utilizando  un desplazamiento y suma , con una variante para performance ( repitiendo 8 veces ) :</p>
<pre class="brush: cpp;">
djbx33a(
    register act_uint8_t *key,
    register act_size_t len)
{
    register act_uint32_t hash = 5381;

#ifdef ACT_NON_OPTIMIZE
    while (len-- &gt; 0)
        hash = ((hash &lt;&lt; 5) + hash) + *key++;
#else
    /* variant with the hash unrolled eight times */
    for (; len &gt;= 8; len -= 8 ) {
        hash = ((hash &lt;&lt; 5) + hash) + *key++;
        hash = ((hash &lt;&lt; 5) + hash) + *key++;
        hash = ((hash &lt;&lt; 5) + hash) + *key++;
        hash = ((hash &lt;&lt; 5) + hash) + *key++;
        hash = ((hash &lt;&lt; 5) + hash) + *key++;
        hash = ((hash &lt;&lt; 5) + hash) + *key++;
        hash = ((hash &lt;&lt; 5) + hash) + *key++;
        hash = ((hash &lt;&lt; 5) + hash) + *key++;
    }
    switch (len) {
        case 7: hash = ((hash &lt;&lt; 5) + hash) + *key++; /* fallthrough... */
        case 6: hash = ((hash &lt;&lt; 5) + hash) + *key++; /* fallthrough... */
        case 5: hash = ((hash &lt;&lt; 5) + hash) + *key++; /* fallthrough... */
        case 4: hash = ((hash &lt;&lt; 5) + hash) + *key++; /* fallthrough... */
        case 3: hash = ((hash &lt;&lt; 5) + hash) + *key++; /* fallthrough... */
        case 2: hash = ((hash &lt;&lt; 5) + hash) + *key++; /* fallthrough... */
        case 1: hash = ((hash &lt;&lt; 5) + hash) + *key++; break;
        default: /* case 0: */ break;
    }
#endif
    return hash;
}
</pre>
<p>Tambien puede utilizarse una variante usando un XOR</p>
<pre class="brush: cpp;">
 hash = ((hash &lt;&lt; 5) + hash) ^ *key++;
</pre>
<p>Tambien es posible utilizar algoritmos de <strong>checksum o criptograficos </strong> como funciones de dispersión, generalmente producen valores con una distribucion lo suficientemente uniformes , en particular SHA-1 garantiza una uniformidad fuerte , para aplicaciones comunes la desventaja de utilizarlo es el costo del tiempo de calculo.</p>
<p>A modo de conclusión existen multiples funciones de generacion de llaves de dispersión, lo importante es que cumplan con proveer una distribucion uniforme para un set de datos dado. Es importante , además, que sean eficientes en funcion de tiempo, esperando un tiempo lineal. Es posible utilizar funciones criptograficas o de checksum ( no use CRC32  <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ).</p>
<p>Una formula para calcular la probabilidad de una colisión, puede ser :</p>
<div id="attachment_44" class="wp-caption alignnone" style="width: 160px"><a href="http://niedbalski.files.wordpress.com/2010/05/formula.png"><img class="size-thumbnail wp-image-44" title="formula" src="http://niedbalski.files.wordpress.com/2010/05/formula.png?w=150&#038;h=64" alt="" width="150" height="64" /></a><p class="wp-caption-text">Hash collision formula</p></div>
<p>Por ejemplo 80M de llaves @ 16 KB ( 12.2 TB) tiene una probabilidad de 2.18e-31 de una colisión.</p>
<p>Recordarles que cuando se implementa un algoritmo de tabla hash es importante proveer un buen mecanismo de solución a colisiones, tema que abordare en otro articulo.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/niedbalski.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/niedbalski.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/niedbalski.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/niedbalski.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/niedbalski.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/niedbalski.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/niedbalski.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/niedbalski.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/niedbalski.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/niedbalski.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/niedbalski.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/niedbalski.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/niedbalski.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/niedbalski.wordpress.com/25/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niedbalski.wordpress.com&amp;blog=1553388&amp;post=25&amp;subd=niedbalski&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://niedbalski.wordpress.com/2010/05/13/hash-tables-dilema/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86a2b6008a45ae3fdccec294f5a75c7c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">niedbalski</media:title>
		</media:content>

		<media:content url="http://niedbalski.files.wordpress.com/2010/05/formula.png?w=150" medium="image">
			<media:title type="html">formula</media:title>
		</media:content>
	</item>
	</channel>
</rss>
