Pergunta

Eu estou olhando para criar um sistema de reservas de curta duração simples, e eu gostaria de gerar números de confirmação que são

  • única
  • aleatório-olhando
  • alfanumérico
  • a curto ish, pelo menos muito mais curto do que 32 cadeias de caracteres de comprimento retornados por sha1

Eu só estou olhando para ter ~ 500 reservas, por isso eu não faço imaginar alta probabilidade de collissions.

Uma idéia que eu tive é gerar um hash SHA1 baseado em um selo de data e hora e nome de usuário, em seguida, truncando-lo para seus primeiros 10 caracteres. Será que algo parecido o suficiente ser confiável única para efeitos de processamento de ~ 500 reservas?

Foi útil?

Solução

Não deve haver nenhuma diferença na aleatoriedade de qualquer bit de um hash SHA-1, de modo que é possível. Outra forma seria a dobrar o hash em si mesmo usando XOR até que você tenha 60 bits no valor de dados, em seguida, codificá-lo usando base 64 para obter um resultado principalmente de alfa-numérico.

Isso só é necessário se você quiser ser capaz de gerar a mesma Id repetidamente para os mesmos dados de entrada. Caso contrário, se um id aleatório que você gera uma vez, e espera para depois disso, usar a sugestão Anders'. Se você tiver um conflito, apenas gerar outro.

Outras dicas

Você pode usar qualquer outra coisa, até mesmo um gerador de números aleatórios simples; no entanto, você deve verificar se o código de reserva já não está presente. Se este for o caso, adicionar caracteres ( 'x') para a cadeia (data + usuário) até chegar um novo aleatório / SHA1 / etc.

Eu só estou olhando para ter ~ 500 reservas, então eu não imagino alta probabilidade de collissions.

Outra idéia estúpida: gerar 1000 ou 2000 números aleatórios exclusivos com as propriedades desejadas, armazená-los em algum lugar, e atribuí-los aos usuários que se registram:)

Aqui está uma maneira de fazê-lo em Perl:

sub get_random_name()
{
  my @chars=('a'..'z','A'..'Z');
  my $random_string;

foreach (1..22) { # rand @chars will generate a random # number between 0 and scalar @chars $random_string .= $chars[rand @chars]; } return $random_string . "-" . time(); }

Não me lembro quanto tempo a tempo parcial () é, portanto, você pode ter que ajustar os números para ajustar seu comprimento. Você também pode remover essa parte se você não precisa dele.

Se ele é realmente apenas 500, então pré-gerar 20.000 deles, em uma tabela, em seguida, obter o "próximo não utilizado" quando você precisar dele.

Algumas boas dicas sobre esta questão: como faço para criar uma cadeia alfa-numérico aleatório em C ++?

Eu gostaria de evitar incluindo personagens como "1", "l" e "O", "0" e "5", "S" e "Z", "2" em sua seqüência, para torná-lo fácil para os clientes quando eles precisam de ler o seu código de reserva por telefone. O algoritmo apresentado nesse link deve ajudá-lo a fazer isso.

usar um guid? 16 caracteres, embora se você realmente não se preocupam com colisão, você poderia simplesmente escolher os primeiros n caracteres.

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