Pregunta

¿Cómo generar la identificación única que es número entero en Java que no se adivina el próximo número?

¿Fue útil?

Solución

Como única Qué necesita ser?

Si sólo es única dentro de un proceso, entonces usted puede utilizar un AtomicInteger y llamada incrementAndGet() cada vez que necesite un nuevo valor.

Otros consejos

int uniqueId = 0;

int getUniqueId()
{
    return uniqueId++;
}

Añadir synchronized si usted quiere que sea seguro para hilos.

Es fácil si se ven limitados en cierta medida.

Si usted tiene un hilo, que sólo tiene que utilizar IDunico ++; Asegúrese de guardar la corriente IDunico al salir.

Si usted tiene múltiples hilos, funciona un método sincronizado generateUniqueID comunes (implementado el mismo que el anterior).

El problema es cuando se tiene muchas CPU -. Ya sea en un clúster o alguna configuración distribuida como un juego peer-to-peer

En ese caso, generalmente puede combinar dos partes para formar un solo número. Por ejemplo, cada proceso que genera un identificador único puede tener su propio número de ID de 2 bytes asignados y luego combinarlo con un IDunico ++. Algo así como:

return (myID << 16) & uniqueID++

Puede ser difícil distribuir la porción "MyID", pero hay algunas maneras. Puede tomar sólo uno de una base de datos centralizada, solicitar un identificador único de un servidor centralizado, ...

Si usted tuvo un largo en lugar de un int, uno de los trucos comunes es tomar el ID del dispositivo (UUID) de ETH0, que se garantiza que sea único a un servidor - a continuación, sólo tiene que añadir en un número de serie

Si realmente se quiere decir entero en lugar de int:

Integer id = new Integer(42); // will not == any other Integer

Si quieres algo visible fuera una JVM a otros procesos o para el usuario, persistente, o una serie de otras consideraciones, a continuación, hay otros enfoques, pero sin contexto en el que son probablemente mejor usar utilizando la incorporada en el carácter único de la identidad del objeto dentro de su sistema.

Sólo generar Identificación y comprobar si ya está presente o no en la lista de identificadores generados.

¿Es necesario que sea;

  • única entre dos máquinas virtuales de Java que se ejecutan en al mismo tiempo.
  • incluso si el único JVM se reinicia.
  • thread-safe.
  • nulo apoyo? si no, el uso int o largo.
 import java.util.UUID;

 public class IdGenerator {
    public static int generateUniqueId() {      
        UUID idOne = UUID.randomUUID();
        String str=""+idOne;        
        int uid=str.hashCode();
        String filterStr=""+uid;
        str=filterStr.replaceAll("-", "");
        return Integer.parseInt(str);
    }

    // XXX: replace with java.util.UUID

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.println(generateUniqueId());
            //generateUniqueId();
        }
    }

}

Espero que esto le ayuda.

Único en cualquier momento:

int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top