¿Dar identificaciones únicas a todos los nodos?

Estoy haciendo una clase en Python que relaciona muchos nodos y bordes juntos. También tengo otras operaciones que pueden tomar dos objetos separados y combinarlos en un solo objeto del mismo tipo, y así sucesivamente.

Sin embargo, necesito una forma de dar a cada nodo una ID única para una búsqueda fácil. ¿Hay una “forma adecuada” de hacer esto o simplemente tengo que mantener una variable de ID externa que aumente y transfiero a mis métodos de clase cada vez que agregué más nodos a cualquier objeto?

También consideré generar una cadena aleatoria para cada nodo en el momento de la creación, pero aún existe un riesgo de error de colisión (incluso si esta probabilidad es cercana a cero, todavía existe y parece un defecto de diseño, si no es una forma de ir con demasiado tiempo de ingeniería). al respecto de todos modos).

Puedes mantener una variable de clase y usarla para los identificadores ordinales:

class Node(object): _id = 0 def __init__(self): self._id = Node._id Node._id += 1 

También tiene la ventaja de que su clase podrá saber cuántos objetos se crearon en total.

Esto también es mucho más barato que los identificadores aleatorios.

Si solo necesita un identificador único, la función id() incorporada de Python lo haría:

Devuelve la “identidad” de un objeto. Este es un entero (o entero largo) que se garantiza que será único y constante para este objeto durante su vida útil. Dos objetos con tiempos de vida no superpuestos pueden tener el mismo valor id ().

Casi ambas soluciones son lo que se hace en la práctica.

Su primera solución es simplemente incrementar un número y le dará singularidad, siempre que no se desborde (con Python Bigintegers, esto no es realmente un problema). La desventaja de este enfoque es que si comienza a hacer concurrencia, debe asegurarse de utilizar el locking para evitar las carreras de datos al incrementar y leer su valor externo.

El otro enfoque donde se genera un número aleatorio funciona bien en la situación de concurrencia. Cuanto mayor sea el número de bits que utilice, menor será la probabilidad de que se produzca una colisión. De hecho, puede garantizar que no tendrá colisiones si utiliza, por ejemplo, 128 bits para su identificación.

Un enfoque que puede utilizar para garantizar aún más que no tiene colisiones, es hacer que sus ID únicas sean algo como TIMESTAMP_HASHEDMACHINENAME_PROCESSID / THREADID_UNIQUEID. Entonces, prácticamente no puede haber colisiones a menos que genere dos de los mismos UNIQUEID en el mismo proceso / subproceso en 1 segundo. MongoDB hace algo como esto donde solo incrementan el UNIQUEID. No estoy seguro de lo que hacen en el caso de un desbordamiento (que supongo que no sucede con demasiada frecuencia en la práctica). Una solución podría ser simplemente esperar hasta el siguiente segundo antes de generar más ID.

Probablemente esto es una exageración de lo que está intentando hacer, pero es un problema bastante interesante.

UUID es bueno para este tipo de cosas.

 >>> from uuid import uuid4 >>> uuid4().hex '461dd72c63db4ae9a969978daadc59f0' 

Los ID universalmente únicos tienen una tasa de colisión muy baja, a menos que esté creando miles de millones de nodos, debería ser el truco.