logo

Acerca de

Bienvenido a mi blog, el sitio perfecto para mis inquietudes, experiencias e idas de olla sobre temas de hoy en día.

Historia al azar

Categorías

Últimas entradas

Últimos comentarios

Enlaces

Meta

photo Luis PeraltaEstado Jabber
Ziritione
Castellón Spain
39.997638, -0.064030

Sindica

Sindícame, por cortesía del subliminal Atom.

29 Enero 2008

Los hashes o resúmenes FNV (de Fowler / Noll / Vo) son útiles por varias razones:

  • Es muy rápido generarlos
  • El tamaño del hash es fácilmente manipulable
  • Se portan muy bien, es decir, producen pocas colisiones

Pues hoy necesitaba usarlos con mi querido Python y curiosamente nadie lo había implementado. Así que no me ha quedado más remedio que ponerme (no sé quién me ha dicho esta tarde que eso sería sólo un algoritmo, que no tendría complicación... en cuanto lo recuerde se va a acordar). Por si a alguien le viene bien:

def FNV1a32(key):
    fnv_prime = long(0x1000193)
    hash = long(0x811C9DC5)
    for i in range(len(key)):
      hash ^= ord(key[i])
      hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24)
    return (hash & 0x00000000ffffffffL)

def FNV132(key):
    fnv_prime = long(0x1000193)
    hash = long(0x811C9DC5)
    for i in range(len(key)):
      hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24)
      hash ^= ord(key[i])
    return (hash & 0x00000000ffffffffL)

La diferencia entre FNV132 y FNV1a32 es el orden en el que se hace la multiplicación. Y aquí sólo he puesto los métodos que calculan el hash de 32 bits, en la referencia de arriba tenéis cómo hacer para generarlos variables (escoger un buen primo inicial, fnv_prime, y un valor inicial del hash, hash, adecuados y quedarnos sólo con la parte del resultado que nos interese).

22 Agosto 2007

Para que no se olvide:

#!/usr/bin/python
import dbus
bus = dbus.SessionBus()
proxy_obj = bus.get_object('org.freedesktop.geoclue.position.hostip','/org/freedesktop/geoclue/position/hostip')
geoclue_iface = dbus.Interface(proxy_obj, 'org.freedesktop.geoclue.position')
coordinates = geoclue_iface.current_position()
14 Septiembre 2006

Es bien conocido que algunos lenguajes de programación prefieren utilizar una sintaxis sencilla y eliminar el uso de llaves y otras marcas para identificar ámbitos y bloques de código. Uno de estos lenguajes es Python. Un ejemplo de lenguaje que prefiere marcado un poco más sofisticado es Perl.

Antes de que a alguno se le ocurriese lo de complicar un poco la sintaxis de Python para poder hacer algunas de las filigranas que se pueden hacer en otros lenguajes (básicamente hacer el código mucho menos legible), ya han añadido una curiosa funcionalidad:

  peralta@daphne:~/cvs $ python
  Python 2.4.3 (#2, Apr 27 2006, 14:43:32)
  [GCC 4.0.3 (Ubuntu 4.0.3-1ubuntu5)] on linux2
  Type "help", "copyright", "credits" or "license" for more information.
  >>> from __future__ import braces
    File "<stdin>", line 1
    SyntaxError: not a chance
  >>>

Vamos, que ni de coña :)

15 Septiembre 2005

Otro claro ejemplo de la facilidad y sencillez de hacer algunas cosas con Python.

12 Mayo 2005

Como diría Javi: escuchando compulsivamente la inspiración divina para superar el nivel 6 del Python Challenge. Os lo recomiendo.