Qualquer sequencia aleatoria (ou ate mesmo sequencial) de numeros funciona, o que importa mesmo eh o seu algoritmo de validacao. O modulo de 11 que o CPF e CNPJ usam sao famosinhos, e implementacoes nao faltam, mas nada te impede de bolar outros.
Você quer gerar um número seqüencial único, só que de maneira distribuída (para não ter de usar um sistema que centraliza a geração).
Neste caso, no número inclua também a localização (como é o caso do próprio CNPJ, onde um dos dígitos indica em que região do Brasil o CNPJ foi gerado).
É mais fácil de pensar em placas de carro. Se você andou reparando, as placas que começam por A e vão até BFA (se não me engano) são do Paraná. A partir de BFA, e até GKI (se não me engano), são de São Paulo, e assim por diante.
Você quer um número totalmente aleatório (como um GUID ou UUID, mas com dígitos de verificação); dessa forma, se o número for suficientemente grande e você usar um bom gerador de números aleatórios, mesmo com geração descentralizada a probabilidade de termos dois números iguais é infinitesimal;
Bom, para o prototipo do trabalho creio que nao serah necessario numeros de identificacao de regiao, o q eu preciso fazer é o seguinte: uma identificacao que, de preferencia contenha só números e que sejapossível gerá-la sem acesso à base de dados (em modo off-line), ou seja, sem comparar pra ver se ela já existe e ainda assim ser válida. foi por isso que eu pensei no esquema dos milisegundos… O problema é que eu gostaria de um número que fosse um pouco menor, hehe
Eduardo, acho que um GUID se é aleatório como o thingol disse, é mais confiável que basear-se em milissegundos, mas se você fosse usar mesmo assim, para diminuir o tamanho que tal você contar os milissegundos a partir de uma determinada data acima (bem acima) de 1/1/1970, tipo hoje? Não serve? Não sei se a quantidade de dígitos diminuiria satisfatoriamente.
Esse teu problema eu também fico pensando como fazer mas é difícil. Penso que nesses casos é preciso buscar informações que sejam únicas e jutar tudo num ID. Tipo, dois planetas não podem estar num mesmo espaço (considerando a escala), assim poderíamos usar a posição do planeta, junto com contagem de tempo, como parte de um identificador garantidamente único. É o que imagino. MAC Addreess, FCC ID, endereços IP etc. seriam coisas que para mim serviriam de base.
Você poderia explicar o que exatamente você quer identificar?
Aliás thingol, eu não sabia que o GUID é aleatório, eu achava que não havia nem probabilidade de haver ids iguais, pelo o que eu li por aí.
Desculpe, não posso resistir: o que seria uma sequência sequencial? :lol:
É um emissor de Cupom Fiscal Virtual, neste casso a ID deveria ser grande o suficiente para suportar o numero de transacoes comerciais realizadas tipo em santa catarina, algo na casa de milhares… bom, se eu usasse os milisegundos começando em uma determinada data, seria muito fácil o tamanho da id aumentar, em tipo um ano, ou ateh menos, enquanto q se eu utilizar os milisegundos baseados em 1970, só em 2322 seria aumentado um dígito. O que em todo caso, gerar um código e que pudesse ter vários tamanhos não seria uma maneira muito boa, a meu ver, o ideal eh ter um tamanho fixo. Eu ainda acrescentei dois dígitos de controle no final, para evitar uma repetição…
Um GUID pode ser gerado usando-se o MAC Address como um de seus componentes, mas hoje em dia o próprio Windows gera um GUID de forma completamente aleatória (sem mostrar o MAC Address de maneira explícita dentro do GUID) devido a problemas de privacidade (você sabe como os americanos são paranóicos, e com certa razão).
É que seria possível você determinar a partir do GUID que máquina gerou o tal do GUID, já que você conhece o MAC Address.
Para o Eduardo:
GUID = Globally Unique Identifier, ou UUID - Universally Unique Identifier - é porque ele é uma string aleatória de 128 bits, e a probabilidade de você ter dois GUIDs iguais, se todos os geradores de números aleatórios usados para gerá-los forem bons, é infinitesimal. Antigamente no GUID era incluído o MAC Address (endereço da placa de rede), que é um número que cada fabricante de placa de rede se compromete a manter único. Tanto é que o início do número do MAC Address indica qual é o código do fabricante - se você lembra de códigos de barras, se o código começa por 789 indica que o produto foi registrado no Brasil.
(Bom, pelo menos em teoria não deveria haver duas placas de rede com o mesmo MAC Address, mas como você sabe, hoje em dia é possível configurar certas placas para ter exatamente o MAC Address desejado, não o inicializado pelo fabricante).
OI problema eh que no caso seria uma string, a meu ver ficaria mais fácil para o usuário ter que digitar apenas números, eu pessoalmente não estou gostando de usar Milisegundos, hehe, mas até agora não vi outra alternativa melhor
Bom, difícil. O GUID é um hexadecimal, você pode transformar em dígitos decimais, mas vai ficar ainda maior do que o exemplo que você deu, Eduardo.
Cara e se você formatasse a data da seguinte maneira: yyyymmddhhmmssmmmm (ano, mês, dia, hora, minuto, segundo, milissegundo)? Ficaria com 18 dígitos, mas dá pra encurtar ainda mais, sacou a idéia, transformar os milissegundos em algo mais curto?
Como você vai garantir que os dois dígitos no final garantirão que os IDs não vão se repetir?
Outra coisa, você começando a contar a partir de hoje, você pode preencher com zero para ficar com tamanho fixo. O número de zeros será determinado de acordo com o limite que você deseja (tipo, a aplicação vai existir para sempre?):
00001-99999
Ih!! Acabaram de avisar que tem um fio pegando o fogo aqui, tenho que desligar o computador!!!
Use hashing de alguns dados como IP/MAC/hora com um PRNG não reiniciado, descarta boa parte dos bits e pronto. Aleatorio o suficiente e com pouca colisão.
Mas afinal, qual o problema de usar um contador seqüêncial?
Caso você queira uma seqüência não repetida de números mas que não siga a ordem natural, vai precisar estudar um pouco de teoria dos números e algebra linear para achar um corpo/anel que seja bom.
bom, a principio, nao usaremos sequencial pq precisa senao outro usuario pode ter a informacao, já que nao utilizaremos nenhuma senha… este é o motivo… ateh agora o q melhor atendeu as exigencias foi o milisegundos msm… já que dificilmente vc acertaria os milisegundos e ainda os dois digitos de controle no final como eu demonstrei no meu primeiro post além de que tem que ser possível gerá-lo em modo off-line, sem acesso à base de dados onde eles serão armazenados
Bom, talvez milisegundos não seja mto confiável mesmo, ainda mais que milhares de chaves serão geradas diariamente, o que não é viável eh que o número a ser digitado seja muito grande, creio que até 15 dígitos é aceitavel. vou dar uma olhada nesse hilo, talvez se utilizássemos alguma operação sobre bits
bom, andei pensando e acho que irei utilizar a sugestao do renato de contar os milisegundos a partir de uma data em especifico, assim os números aparentam ser mais “aleatórios”…
Quer um conselho? Não faz assim não. Atente para o que o thingol disse e use a dica do louds. O trabalho será o mesmo mas você dormirá muito mais tranquilo.