Algoritmo para gerar "nosso número" sem problemas no futuro.

1,460 views
Skip to first unread message

Charles

unread,
May 11, 2012, 11:22:33 AM5/11/12
to django...@googlegroups.com
Boa tarde!

Estou desenvolvendo um sistema para pagamento via boleto.
Existe um campo chamado "nosso número" (unique=True) no meu model Cobranca e estou estudando qual a melhor maneira de gerar o número para preencher o "nosso número" (que deve ser único para a identificação de cada boleto).

Sabendo que o "nosso número" comporta até 17 números, sendo os 7 primeiros o número do convênio, como eu geraria os outros 10 números de forma que não tivesse problemas futuramente se o banco de dados tiver uma grande quantidade de clientes (*Problema: conflito com outros "nosso número" gerado no passado)?

Ex: primeiro mês é gerado boletos para 10000 clientes, cada boleto terá um nosso número específico (poderia utilizar o ID da cobrança para identificar cada "nosso numero"), no mês seguinte será gerado novos boletos para esses 10000 clientes, sendo estes boletos também únicos e diferentes do mês anterior (e assim por diante).

O que eu vejo nessa lógica é que chegará um dia no futuro que haverá 9.999.999.999 cobranças geradas, e ultrapassará o limite de 10 números para o campo "nosso numero". Qual seria a solução para resolver esse problema automaticamente no futuro?

flit

unread,
May 11, 2012, 11:28:40 AM5/11/12
to django...@googlegroups.com
Gerar os numeros esperando que eles se repitam.
Mas internamente fazer uma consistencia, entre o id do boleto + cliente, ou ate mesmo data?

O Id do boleto VAI repetir se 'estourar' o limite numerico 10^10

Mas nao precisas usares o id do boleto como chave ou id unico no teu sistema..
Pode ser o id do boleto + data (para manter numerico o campo)

[]s

Henrique

2012/5/11 Charles <djangoma...@gmail.com>

--
Django Brasil em Google Groups <http://groups.google.com.br/group/django-brasil>
Associe-se à Python Brasil e suporte nossa comunidade! <http://associacao.python.org.br/>

Paulo Sampaio

unread,
May 11, 2012, 11:56:25 AM5/11/12
to django...@googlegroups.com
Cara, quando for chegando no fim, você atualiza a aplicação pra zerar o contador, os boletos antigos você pode recuperar utilizando a data como diferencial.

Só tenha em mente que gerando 10mil boletos por mês você vai precisa de mais de 8mil anos pra esgotar =]


Atenciosamente,
__
Paulo Sampaio

Guilherme Kuhn

unread,
May 11, 2012, 12:43:53 PM5/11/12
to django...@googlegroups.com
Como você mesmo disse, o "nosso número" é separado 7-10, pq salvar ele como um único número e ter que fazer todas essas validações toda vez? Em vez disso pq não salvar apenas os 10 ultimos digitos já que os 7 primeiros são sempre iguais? Você pode deixar esses 7 primeiros em um outro model para poder tornar a mudança dinâmica, fazendo a relação Convênio 1 ->  N Boleto.

--
Django Brasil em Google Groups <http://groups.google.com.br/group/django-brasil>
Associe-se à Python Brasil e suporte nossa comunidade! <http://associacao.python.org.br/>



--



Rafael dos Santos Gonçalves

unread,
May 11, 2012, 1:10:10 PM5/11/12
to django...@googlegroups.com
já fiz coisa parecida a muito tempo atrás, eu coloquei um campo id com auto incremento e um campo convenio. E na minha classe um property que juntava os dois :D

abs
Rafael dos Santos Gonçalves
Ramal - 6757

andre fagundes

unread,
May 11, 2012, 1:27:34 PM5/11/12
to django...@googlegroups.com
Eu não se você poderia, mas qualquer sistema de IDs eu daria preferência ao UUID.

Exemplo:
b8913669-26aa-4e4b-a530-98144506451c

Via Wikipedia:

Para colocar esses números em perspectiva, do risco anual de ser atingido por um meteorito é estimada em uma chance em 17 bilhões de dólares, [32] que significa que a probabilidade é de 0,00000000006 (6 × 10-11), o equivalente a as chances de criação de algumas dezenas de trilhões de UUIDs em um ano e ter uma duplicata. Em outras palavras, apenas depois de geração de 1 bilião de UUIDs cada segundo para os próximos 100 anos, a probabilidade de criar apenas uma duplicado seria de cerca de 50%. A probabilidade de uma duplicata seria de cerca de 50%, se cada pessoa no planeta possui 600 milhões de UUIDs.


MongoDB também usa uuid. Olha aqui.

Você pode também usar sha1, e pegar os cinco primeiros caracteres, igual o git faz. Mas quanto menor o id, maior a probabilidade deles se chocarem.

Vinicius Mendes

unread,
May 11, 2012, 1:31:14 PM5/11/12
to django...@googlegroups.com
Como o Paulo Sampaio falou, se você gerar 10 mil boletos por mês, vai demorar mais de 80 mil anos para esgotar os 10 dígitos e começar a repetir.

Atenciosamente,
Vinicius Mendes
Engenheiro de Computação
Globo.com



2012/5/11 Guilherme Kuhn <g.k...@gmail.com>

Charles

unread,
May 11, 2012, 4:41:36 PM5/11/12
to django...@googlegroups.com
Resolvi o problema salvando no nosso_numero apenas os dez ultimos números do ID da cobrança. Assim, sempre quando eu for puxar o nosso_numero, eu puxo o mais recente para não dar conflito caso tenha algum repetido do passado.

c = Cobranca()
c.cliente = cliente
c.valor = valor 
...
c.save()
if len(c.id) > 10:
    # guardo em nosso_numero apenas os ultimos dez números do ID. 
    c.nosso_numero = c.id[::-1][0:10][::-1]
else:
    c.nosso_numero = c.id
c.save()

Obrigado a todos pela atenção, abraços. 
Reply all
Reply to author
Forward
0 new messages