Domanda

Sto cercando di creare un semplice sistema di prenotazione di breve durata e vorrei generare numeri di conferma che sono

  • Unique
  • casuale cercando
  • alfanumerico
  • breve, almeno molto più breve di 32 stringhe lunghe di caratteri restituite da sha1

Sto solo cercando di avere ~ 500 prenotazioni, quindi non immagino alta probabilità di collisioni.

Un'idea che ho avuto è di generare un hash sha1 basato su un timestamp e un nome utente, quindi troncandolo ai suoi primi 10 caratteri. Qualcosa del genere sarebbe sufficientemente unico in modo affidabile ai fini dell'elaborazione di ~ 500 prenotazioni?

È stato utile?

Soluzione

Non dovrebbe esserci alcuna differenza nella casualità di un dato bit di un hash SHA-1, quindi è possibile. Un altro modo sarebbe di piegare l'hash in se stesso usando XOR fino a quando non si hanno 60 bit di dati, quindi codificarlo usando Base 64 per ottenere un risultato prevalentemente alfanumerico.

Ciò è necessario solo se si desidera essere in grado di generare ripetutamente lo stesso ID per gli stessi dati di input. Altrimenti, se un ID casuale che generi una volta e tieni premuto dopo, usa il suggerimento di Anders. Se riscontri un conflitto, generane un altro.

Altri suggerimenti

Puoi usare qualunque cosa, anche un semplice generatore di numeri casuali; tuttavia, è necessario verificare che il codice di prenotazione non sia già presente. In questo caso, aggiungi caratteri ('x') alla stringa (data + utente) fino a ottenere un nuovo casuale / sha1 / ecc.

  

Sto solo cercando di avere ~ 500 prenotazioni, quindi non immagino un'alta probabilità di collisioni.

Un'altra stupida idea: generare 1000 o 2000 numeri casuali unici con le proprietà desiderate, memorizzarli da qualche parte e assegnarli agli utenti mentre si registrano :)

Ecco un modo per farlo in 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(); }

Non ricordo quanto sia lunga la parte time (), quindi potresti dover regolare i numeri per adattarli alla tua lunghezza. Puoi anche rimuovere quella parte se non ti serve.

Se in realtà sono solo 500, quindi pre-generane 20.000, in una tabella, quindi ottieni il "successivo non utilizzato" " quando ne hai bisogno.

Alcuni buoni consigli su questa domanda: Come faccio a creare una stringa alfanumerica casuale in C ++?

Eviterei di includere caratteri come " 1 " ;, " l " ;, e " O " ;, " 0 " e "5", "S", e "Z", "2" nella tua stringa, per facilitare i clienti quando devono leggere il codice di prenotazione al telefono. L'algoritmo presentato a quel link dovrebbe aiutarti a farlo.

usare un guid? 16 personaggi, anche se se non ti interessa davvero la collisione, puoi semplicemente scegliere i primi n caratteri.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top