Pergunta

Eu gostaria de escrever um utilitário que vai me fornecer uma ID relativamente único em Java. Algo muito simples, como x pedaços de timestamp + pedaços y de número aleatório.

Então, como eu ia implementar o seguinte método:

long getUniqueID()
{
    long timestamp = System.currentTimeMillis();
    long random = some random long

    ...

    return id;
}

bônus

Todas as sugestões para outras informações facilmente obtidos que eu poderia usar para formar o meu ID?

Nota:. Estou ciente de GUIDs e sei Java tem uma classe UUID, mas eu não quero algo que é de 128 bits de comprimento

Foi útil?

Solução

Apenas clip os bits que você não precisa:

return java.util.UUID.randomUUID().getLeastSignificantBits();

Outras dicas

O que você está tentando fazer é criar um função hash que combina duas longas valores em um único valor longo. Neste caso, a função uniformidade do hash será da maior importância, uma vez em colisões criados valores de identificação exclusivos são inaceitáveis. No entanto, se você pode comparar valores de hash para identificadores criados anteriormente, então as colisões pode ser resolvido, modificando o hash até que ocorra nenhuma colisão.

Por exemplo, você poderia ter o carimbo de tempo e realizar uma ou-exclusivo (usando o acento circunflexo ^ operador em Java) com o valor aleatório. Se uma colisão é detectada, em seguida, adicionar um para o resultado.

Se exclusiva na mesma JVM é o suficiente, então algo como isso deve fazer o trabalho.

public class UniqueID {
  static long current= System.currentTimeMillis();
  static public synchronized long get(){
    return current++;
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top