2010-11-29 11 views
6

No estoy muy bien con las matemáticas, estadísticas, etc. Me he estado preguntando, si utilizo el siguiente:Pregunta matemática respecto uuid4 de Python

import uuid 
unique_str = str(uuid.uuid4()) 
double_str = ''.join([str(uuid.uuid4()), str(uuid.uuid4())]) 

Es double_str cadena cuadrado tan único como unique_str o simplemente una cierta cantidad más único? Además, ¿hay alguna implicación negativa al hacer algo como esto (como una situación de problema de cumpleaños, etc.)? Esto puede sonar ignorante, pero simplemente no lo sabría ya que mis matemáticas abarcan álgebra 2 en el mejor de los casos.

+0

¿La unicidad es un continuo? "Más único" siempre es desconcertante, incluso cuando puedes entender lo que significa. –

+0

@Fred - 'uuid4' no garantiza que no produzca colisiones. Si lo fuera, no me preocuparía hacer esto. – orokusaki

Respuesta

18

La función devuelve un UUID uuid4 creado a partir de 16 bytes aleatorios y es extremadamente poco probable que produzca una colisión, hasta el punto en el que es probable que ni siquiera debe preocuparse por ello.

Si por alguna razón uuid4hace producir un duplicado es mucho más probable que sea un error de programación, tales como un fracaso para inicializar correctamente el generador de números aleatorios que genuina mala suerte. En cuyo caso, la aproximación que está utilizando será no que sea mejor: un generador de números aleatorios inicializado incorrectamente aún puede generar duplicados incluso con su enfoque.

Si utiliza la implementación predeterminada random.seed(None) se puede ver en el source que sólo 16 bytes aleatorios se utilizan para inicializar el generador de números aleatorios, por lo que esta es una cuestión que tendría que resolver primero. Además, si el sistema operativo no proporciona una fuente de aleatoriedad, se utilizará la hora del sistema, que no es muy aleatoria.

Pero ignorando estos problemas prácticos, usted está básicamente en la línea correcta. Para usar un enfoque matemático primero debemos definir lo que quiere decir con "singularidad". Creo que una definición razonable es la cantidad de ID que necesita generar antes de que la probabilidad de generar un duplicado supere alguna probabilidad p. Una fórmula approcimate de esto es:

alt text

donde d es 2**(16*8) para un único UUID generado aleatoriamente y 2**(16*2*8) con su enfoque sugerido. La raíz cuadrada en la fórmula se debe al Birthday Paradox. Pero si lo resuelves, puedes ver que si cuadras el rango de valores d manteniendo constante p, entonces también cuadras n.

+0

A la derecha, la inicialización inadecuada del generador de números aleatorios es algo de lo que preocuparse, no la posibilidad mínimamente impredecible de una colisión. –

+0

No entiendo. ¿Ustedes se están refiriendo a que Python inicializó incorrectamente el generador de números aleatorios? 'uuid4' no requiere que proporcione un generador de números aleatorios. ¿Me estoy perdiendo de algo? – orokusaki

+2

@orokusaki: si no inicializa el generador de números aleatorios, se usará el comportamiento predeterminado y esto puede significar que la hora del sistema se podría utilizar como la semilla. La hora del sistema no es muy aleatoria: dos computadoras diferentes generarán los mismos números "aleatorios" si el tiempo pasa a ser el mismo. Ver: http://docs.python.org/library/random.html#random.seed –

-1

Depende del generador de números aleatorios, pero su singularidad es casi cuadrada.

+0

¿No reduce el período de PRNG usando otro UUID cuando no fue necesario? Su singularidad no está cuadrada si se reduce el tiempo que lleva obtener nubmers aleatorios duplicados. – bot403

+0

@bot403 - el universo es infinito 8D (mira mis tonos) – orokusaki

+0

@bot403, sí, reduces el período, pero depende de la cantidad de entropía en el PRNG si importa o no. –

Cuestiones relacionadas