Pergunta

Como gerar ID exclusivo que é inteiro em java que não adivinham o próximo número?

Foi útil?

Solução

Quão exclusivo isso precisa ser?

Se for único apenas dentro de um processo, você pode usar um AtomicInteger e ligue incrementAndGet() Cada vez que você precisa de um novo valor.

Outras dicas

int uniqueId = 0;

int getUniqueId()
{
    return uniqueId++;
}

Adicionar synchronized Se você deseja que seja seguro.

É fácil se você é um pouco restrito.

Se você possui um thread, basta usar o exclusivo ++; Certifique -se de armazenar o ULEMID atual quando você sair.

Se você possui vários threads, um método GerateUniqueID comuns sincronizado funciona (implementado o mesmo que acima).

O problema é quando você tem muitas CPUs-em um cluster ou em alguma configuração distribuída como um jogo ponto a ponto.

Nesse caso, você geralmente pode combinar duas partes para formar um único número. Por exemplo, cada processo que gera um ID exclusivo pode ter seu próprio número de identificação de 2 bytes atribuído e combiná-lo com um ++ exclusivo. Algo como:

return (myID << 16) & uniqueID++

Pode ser complicado distribuir a parte "Myid", mas existem algumas maneiras. Você pode simplesmente pegar um de um banco de dados centralizado, solicitar um ID exclusivo de um servidor centralizado, ...

Se você teve um longo em vez de um INT, um dos truques comuns é pegar o ID do dispositivo (UUID) do ETH0, isso é garantido para ser exclusivo de um servidor-então apenas adicione um número de série.

Se você realmente quis dizer inteiro em vez de int:

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

Se você deseja algo visível fora de uma JVM para outros processos ou para o usuário, persistente ou uma série de outras considerações, existem outras abordagens, mas sem o contexto você provavelmente está melhor usando a singularidade interna da identidade do objeto dentro Seu sistema.

Basta gerar ID e verificar se já está presente ou não na sua lista de IDs gerados.

Você precisa que seja;

  • Único entre dois JVMs em execução ao mesmo tempo.
  • Único mesmo que a JVM seja reiniciada.
  • discussão segura.
  • apoiar nulo? Caso contrário, use int ou longo.
 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 isso ajude você.

Único a qualquer momento:

int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top