UUIDs y los objetos persistentes

Amm-Python python en ammsoft.com
Jue Nov 15 13:54:52 CET 2007


No estoy seguro de que mi respuesta sea lo que buscas, pero te explico
mi experiencia.

> Después de estar unos días cambiando los arranques de mis
> servidores linux para que usaran UUIDs de disco, me ha 
> sorprendido gratamente que en python 2.5 se haya incluído el 
> módulo 'uuid' para la generación de este tipo de identificadores.
> 
> En lugar de intentar crearme mis propios identificadores,
> basados en fecha y hora de creación, me estoy planteando usar 
> UUIDs para identificar objetos persistentes (eg: registros en 
> bases de datos, documentos, etc). La idea es que estos 
> objetos esten almacenados en varios servidores y medios de 
> almacenamiento (dvds, discos, ...), conformando lo que sería 
> una base de datos documental "distribuída".
> 
> No sé si tenéis experiencia con estos identificadores, pero
> antes de usarlos me surgen algunas dudas:

Yo los utilizo por defecto en casi todas las tablas, asignándoles el
índice primario y vinculando las tablas mediante ese campo. Para
generarlos encontré esta función, es muy simple pero parece que
funciona:

import time, random, md5, socket

def uuid( *args ):
  """
    Generates a universally unique ID.
    Any arguments only create more randomness.
  """
  t = long( time.time() * 1000 )
  r = long( random.random()*100000000000000000L )
  try:
    a = socket.gethostbyname( socket.gethostname() )
  except:
    # if we can't get a network address, just imagine one
    a = random.random()*100000000000000000L
  data = str(t)+' '+str(r)+' '+str(a)+' '+str(args)
  data = md5.md5(data).hexdigest()
  return data

No me "atrevería" a afirmar que sea imposible que se duplique. 
La encontré aquí:
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/213761

La que lleva python 2.5. creo que es esta:
http://zesty.ca/python/uuid.py 

No la conocía, yo todavía uso el python 2.4.2, pero creo que la
incorporaré a mis proyectos.

Muchas bases de datos llevan una función que genera dicho valor
automáticamente. Por ejemplo en Oracle es SYS_GUID(), en MySql UUID(),
creo que en Postgres es la misma. 

Por lo que puedes poner que se genere por defecto al hacer los INSERT.

> - ¿qué tan baja es la probabilidad de repetir dos
> identificadores? Asumo que en una organización pequeña es 
> imposible que se repitan los uuid; pero con internet es 
> complicado hacerse una idea de lo que es o no "posible". Ya 
> sé que son identificadores de 128bits, pero no tengo clara 
> cuál es la garantía de unicidad del algoritmo utilizado 
> (reconozco que no he entrado de lleno a analizarlo).
 
> - ¿qué son los "namespaces" (uuid3 y uuid5)? Más bien parecen
> una especie de "seeds" a la hora de generar los hashes (md5 y 
> sha-1), pero la especificación RFC-1422 no entra en 
> explicaciones. ¿Existe algún criterio para usar un namespace 
> u otro? En un primer momento pensaba en usar NAMESPACE_OID 
> para los registros en una base de datos y NAMESPACE_URL para 
> los documentos. ¿Sería éso correcto? 


> _______________________________________________
> Lista de correo Python-es 
> http://listas.aditel.org/listinfo/python-es
> FAQ: http://listas.aditel.org/faqpyes
> 

_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es