unico servicio numero generate generar como java uuid

java - numero - servicio uuid



Cómo generar UUID largo y exclusivo (4)

Tengo el requisito de generar ID largos únicos para la columna de clave principal de mi base de datos.

Pensé que podía usar UUID.randomUUID (). GetMostSignificantBits () pero a veces también genera algo negativo, lo cual es un problema para mí.

¿Es posible generar solo un largo positivo desde UUID? Habrá miles de millones de entradas, así que quiero que cada clave generada sea única.


Acabo de encontrar esta solución. Por el momento estoy intentando entender la solución. Dice la implementación de Java del copo de nieve de Twitter. Generador de ID secuencial de 64 bits basado en el algoritmo de generación de ID de copo de nieve de Twitter.

https://github.com/Predictor/javasnowflake

Cualquier sugerencia es bienvenida.


Como han escrito los demás, long no tiene suficiente espacio para un número único. Pero en muchos casos, un número puede ser lo suficientemente único para un uso específico. Por ejemplo, una marca de tiempo con la precisión de nanosegundos suele ser lo suficientemente buena. Para obtenerlo, desplace los milisegundos actuales que quedan 20 bits para asignar espacio para nanosegundos y luego superpóngalo con los nanosegundos:

(System.currentTimeMillis() << 20) | (System.nanoTime() & ~9223372036854251520L);

La parte nano & ~ 9223372036854251520L toma los nanosegundos actuales y establece los primeros 44 bytes en 0, dejando solo los 20 bits correctos que representan nanosegundos hasta un milisegundo (999999 nanos) Es lo mismo que:

nanoseconds & ~1111111111111111111111111111111111111111111100000000000000000000

Nota al margen: los nanosegundos no deben usarse para representar la hora actual porque su punto de inicio no es fijo en el tiempo y porque se reciclan cuando alcanzan el máximo.

Puede utilizar cualquier otra manipulación de bits. Por lo general, es bueno tener en cuenta la hora actual y algo más, como la identificación del hilo actual, la identificación del proceso, la ip.



UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE

La razón por la que esto funciona es que cuando lo haces a nivel de bits y con 1 permite que pase el mismo dígito y cuando lo haces a nivel de bits y con 0 lo bloquea y el resultado es 0. Ahora, Long.MAX_Value en binario es

0111111111111111111111111111111111111111111111111111111111111111

esto es 0 seguido de 63 1s (el total es de 64 bits, es largo en java)

Por lo tanto, cuando ingrese bits y un número X con este número anterior, obtendrá el mismo número X, excepto que el bit de la izquierda ahora se convierte en cero. Lo que significa que solo has cambiado el signo de ese número y no el valor.