Pergunta

Preciso gerar um número único de 32 bits em Java. Preciso retornar o número como Java Int, o que é exigido pela interface. Você pode compartilhar algumas idéias sobre isso?

O número será usado como MySQL PK e vários threads podem estar gerando seu próprio ID exclusivo ao mesmo tempo. (Desculpe, decidiu não usar o MySQL ID ID)

Eu tentei a classe UUID, mas parece que os dados que ele gera têm mais bits do que eu posso usar.

Eu encontrei isso, mas não tenho certeza se funciona:

    // seems no way to get int
    UUID id = UUID.randomUUID();
    System.out.println(id);

    // not working either?
    java.rmi.server.UID uid = new java.rmi.server.UID();
    System.out.println(uid.toString());

    // the one i am using
    SecureRandom prng = SecureRandom.getInstance("SHA1PRNG");
    prng.setSeed(System.currentTimeMillis());
    int ret = prng.nextInt();
    System.out.println(ret);
Foi útil?

Solução

Quão "único" você está querendo? Em suma, qual é o domínio de colisão? Se você está lidando com milhares de chaves, então Random.NextInt () Faz exatamente o que você deseja em relação ao que você tentou com a versão 4 UUIDS (o UUID V4 gera 128 bits aleatórios).

Se você precisar de algo com menos chance de colisão, precisa ter um número inteiro incrementado globalmente, mas há muito cuidado para ser levado aqui, como manter o estado entre as startups da JVM. Para isso, você deve olhar para Atomicintegers.

Outras dicas

o SecureRandom A abordagem é boa, mas não coloque a semente nela. Ele escolherá sua própria semente de maneira (presumivelmente) segura.

Você também pode usar um UUID e apenas descartar os bits que não precisa, por exemplo,

int key = (int)UUID.randomUUID().getLeastSignificantBits();

Editar: você também deve estar ciente de que o SecureRandom é significativamente mais lento do que Random. Como você não está fazendo criptografia aqui, por que não usar Random?

Eu acho que você pode usar uma função de hash de 32 bits. Os detalhes são fornecidos no seguinte tutorialhttp://www.concentric.net/~ttwang/tech/inthash.htm

private static int hash(int key){

          key = ~key + (key << 15); // key = (key << 15) - key - 1;
          key = key ^ (key >>> 12);
          key = key + (key << 2);
          key = key ^ (key >>> 4);
          key = key * 2057; // key = (key + (key << 3)) + (key << 11);
          key = key ^ (key >>> 16);
          return key;

    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top