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 uuid4
hace 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:
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
.
¿La unicidad es un continuo? "Más único" siempre es desconcertante, incluso cuando puedes entender lo que significa. –
@Fred - 'uuid4' no garantiza que no produzca colisiones. Si lo fuera, no me preocuparía hacer esto. – orokusaki