[RESOLVIDO] UID numérico

Quero gerar um UID somente com dígitos numéricos, sem usar a classe UUID, pois ela gera algo como ‘54947df8-0e9e-4471-a2f9-9af509fb5889’,
e quero gerar de 20 a 100 dígitos, então gostaria de uma base de estudo para isto, se existe alguma biblioteca, ou se tenho que gerar manualmente,
talvez se baseando nos milisegundos do servidor.
Para testes, tenho idéia de gerar 1 bilhão de registros, e queria saber se não tem a possibilidade de se repetirem.

Uma forma de você gerar um número que talvez não se repita* é usar a classe SecureRandom para gerar uma quantidade grande de bytes - no seu caso, para 100 dígitos decimais, você precisaria gerar 42 bytes (como achei esse número fica como exercício para você).
Aí você usa o construtor de java.math.BigInteger para gerar um BigInteger a partir desses bytes, e em seguida você converte esse BigInteger para string e remove os dígitos excedentes.

  • Ou seja, você quer reduzir a probabilidade de o número não se repetir a valores infinitesimais.
    A probabilidade só seria exatamente zero se você tivesse um lugar unificado que fornecesse os números, o que obviamente você não quer.

[quote=entanglement]Uma forma de você gerar um número que talvez não se repita* é usar a classe SecureRandom para gerar uma quantidade grande de bytes - no seu caso, para 100 dígitos decimais, você precisaria gerar 42 bytes (como achei esse número fica como exercício para você).
Aí você usa o construtor de java.math.BigInteger para gerar um BigInteger a partir desses bytes, e em seguida você converte esse BigInteger para string e remove os dígitos excedentes.

  • Ou seja, você quer reduzir a probabilidade de o número não se repetir a valores infinitesimais.
    A probabilidade só seria exatamente zero se você tivesse um lugar unificado que fornecesse os números, o que obviamente você não quer. [/quote]

Na verdade acho que teria que ser um lugar único para forncer os númeos, um exemplo de uso seria para gerar o UID de um cadastro de usuário de uma app web.

Um identificador de cadastro para uma aplicação Web normalmente é feita via campo de auto-increment ou “sequence” no banco de dados. Não é necessário usar UIDs

Um exemplo, no facebook pode-se ver o uid (fbid) do usuário, então esse uid é o gerado no banco, a PK?

Pode até ser, não sei como é que isso é feito no Facebook.

Se sua taxa de criação de usuários for absurda, como é o caso do Facebook (e que não parece ser o caso do seu sistema), você pode particionar sua base de forma que cada região geográfica tenha seu gerador de IDs. Pense em placas de carro: são reservadas, para o Estado de São Paulo, as placas de prefixos BFA até GKI (se não me engano).

[quote=cleverson_]Quero gerar um UID somente com dígitos numéricos, sem usar a classe UUID, pois ela gera algo como ‘54947df8-0e9e-4471-a2f9-9af509fb5889’,
e quero gerar de 20 a 100 dígitos, então gostaria de uma base de estudo para isto, se existe alguma biblioteca, ou se tenho que gerar manualmente,
talvez se baseando nos milisegundos do servidor.
Para testes, tenho idéia de gerar 1 bilhão de registros, e queria saber se não tem a possibilidade de se repetirem.
[/quote]

Não sei onde raios vc aprendeu sobre UUID, mas o UUID (Universal Unique ID) já é um numero de 128 bits ( ou seja o tamanho de 2 longs). Isso que vc colocou ai é a representação em string do objeto ( é o toString() ). Vc não precisa usar essa representação. Vc pdoe usar hexadecimal ou base64.
Criar isto não é trivial e o numero de dígitos é realmente irrelevante, o que interessa é que os 128 bits sejam universalmente únicos. veja no javadoc para mais informação.

Lá tem os algoritmos que tem que usar.

Na boa. Não tente fazer na mão. Utilize a classe UUID e pronto.