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