public class TXUUIDGenerator
extends java.lang.Object
Esta clase se creo para generar UUIDs. Los UUIDs se
utilizan en base a la clase UUID utilizando primero los bits menos
significativos (con mayor entropía) y los que correspondan del long mas
significativo
El largo en las transacciones es de 96bits. 20 caracteres por 5 bits cada uno nos da 100, pero necesitamos que sea multiplo de 8 )
Máximo de números posibles
Con 96 bits tenemos 2^96 numeros posibles.
Analisis para transacciones:
Si tenemos un pico de 50 TPS (transacciones por segundo) y asumimos que esto se mantiene constante podríamos utilizar este numero por los siguientes 5*10^19 años. (Obs.:Seguir leyendo para ver el analisis de colisiones)
Calculo en Wolfram Alpha(2 ^ 96) / (50 * 24 * 60 * 60 * 365)
Codificacion en Base32
La codificación en Base32 provee la ventaja de ser muy legible para humanos, generando "pretty URLs". http://www.crockford.com/wrmg/base32.html. Por este motivo elegimos Base32 para la codificación. JCARD tiene un largo de maximo 12 caracteres (va a cambiar a 20). Teniendo en cuenta que Base32 necesita 5bits para cada caracter, entonces esto nos da como maximo 100bits (12*5) Para llegar al primer multiplo mas cercano de 8 bits (1 byte) nos quedamos en 96 bits, es decir 12 bytes.
12^62 (jcard limit) >> 12^32 (limite con base 32) >> 2^64 (limite del id generado) > 2^56
Probabilidad de colisión
Si pensamos tener un alto TPS como 8, y lo mantenemos constante por los proximos 20 años nos da un total de :
Llamamos a este valor "n"8*24*60*60*365*20= 5.045.760.000
Aplicando la formula para UUID generados de manera random. Fuente
https://en.wikipedia.org/wiki/Universally_unique_identifier#
Random_UUID_probability_of_duplicates https://tools.ietf.org/html/rfc4122
P(n) = 1- e ^ ( -n^2 / 2x)
En la formula x es la cantidad de valores que puede tener un id, en nuestro caso 2^96. n es la cantidad de IDs que pensamos generar (5.045.760.000). Esto da como resultado 1.
Link a Wolfram AlphaEsta clase fue inicialmente pensada para generar UUIDs de transacciones pero perfectamente se puede acomodar a UUIDs de otros recursos
Los posibles largos de caracteres en base a este algoritmo son: 12,16,20
| Constructor and Description |
|---|
TXUUIDGenerator()
Se utiliza el valor por defecto "12" como longitud máxima de caracteres si no se especifica.
|
TXUUIDGenerator(int characterLength)
Como máximo se producen UUIDs de longitud "characterLength".
|
| Modifier and Type | Method and Description |
|---|---|
java.lang.String |
generate()
Genera y retorna un String con un UUID de la longitud especificada en el constructor (12 por defecto).
|
java.lang.String |
test(java.lang.String[] args) |
static byte[] |
toArray(long l,
int size,
byte[] buff,
int offset)
Dentro de la definición de UUID los bits menos significativos son donde
hay mayor entropia.
|
public TXUUIDGenerator(int characterLength)
characterLength - longitud máxima de caracterespublic TXUUIDGenerator()
public java.lang.String generate()
public static byte[] toArray(long l,
int size,
byte[] buff,
int offset)
l - size - public java.lang.String test(java.lang.String[] args)