2011-07-05 26 views
8

Estoy intentando generar un identificador único de una longitud fija, como los ID generados por Megaupload para los archivos cargados.¿Cómo generar un identificador único de una longitud fija en Java?

Por ejemplo:

  • ALGYTAB5
  • BCLD23A6

En este ejemplo, utilizando de A-Z y 0-9 y con una longitud fija de 8 las combinaciones totales diferentes son 2.821.109.907.456.

¿Qué sucede si ya se ha realizado una de las identificaciones generadas? Esos ids se almacenarán en una base de datos y no deberían usarse más de una vez.

¿Cómo puedo lograr eso en Java?

Gracias.

+0

http://stackoverflow.com/questions/192920/generating-a-globally-unique-identifier-in-java http://download.oracle.com/javase/1,5.0/docs/api/java/ util/UUID.html – Jacob

+0

¿Cuál es el motivo por el que no se desea utilizar una identificación de auto incremento? –

+2

Debería ser difícil de adivinar. –

Respuesta

4

Hmm ... Podría imitar un GUID más pequeño de la siguiente manera. Permita que los primeros 4 bytes de su cadena sean la hora actual codificada, segundos transcurridos después de Unix. Y los últimos 4 solo una combinación aleatoria. En este caso, la única forma en que dos identificaciones coincidirían es que fueron construidas en el mismo segundo. Y las posibilidades de eso serían muy bajas debido a los otros 4 personajes aleatorios.

Pseudocódigo:

get current time (4 byte integer 
id[0] = 1st byte of current time (encoded to be a digit or a letter) 
id[1] = 2nd 
id[2] = 3rd 
id[3] = 4th 
id[4] = random character 
id[5] = random character 
id[6] = random character 
id[7] = random character 
0

Estamos utilizando la base de datos para comprobar si ya existen. Si la cantidad de ID es baja en comparación con el número posible, debería estar relativamente seguro.

También puede echar un vistazo a la clase UUID (aunque son UUID de 16 bytes).

+0

http://download.oracle.com/javase/1,5.0/docs/api/java/util/UUID.html esto podría ayudar – lollancf37

+1

@ lollancf37 gracias por agregar el enlace, aunque prefiero agregar el actual Java 6 versión: http://download.oracle.com/javase/6/docs/api/java/util/UUID.html – Thomas

0

Suena como un trabajo para un hash function. No se garantiza al 100% que una función hash devuelva un identificador único, pero funciona la mayor parte del tiempo. Las colisiones hash deben tratarse por separado, pero existen muchas técnicas estándar para que usted las examine.

Específicamente, la forma en que se ocupa de las colisiones depende de para qué utilice este identificador único. Si se trata de un identificador unidireccional simple en el que le da a su programa la identificación y devuelve los datos, entonces puede simplemente usar la próxima identificación disponible en caso de una colisión.

1

He tratado @ solución de Armen sin embargo, me gustaría dar otra solución

UUID idOne = UUID.randomUUID(); 
UUID idTwo = UUID.randomUUID(); 
UUID idThree = UUID.randomUUID(); 
UUID idFour = UUID.randomUUID(); 

String time = idOne.toString().replace("-", ""); 
String time2 = idTwo.toString().replace("-", ""); 
String time3 = idThree.toString().replace("-", ""); 
String time4 = idFour.toString().replace("-", ""); 

StringBuffer data = new StringBuffer(); 
data.append(time); 
data.append(time2); 
data.append(time3); 
data.append(time4); 

    SecureRandom random = new SecureRandom(); 
int beginIndex = random.nextInt(100);  //Begin index + length of your string < data length 
int endIndex = beginIndex + 10;   //Length of string which you want 

String yourID = data.substring(beginIndex, endIndex); 

Esperanza esta ayuda!

Cuestiones relacionadas