Creazione di una stringa alfanumerica unica di 10 caratteri
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?
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.
In C # puoi usare http://www.dotnetfunda.com/forums/thread1357-how-do-generate-unique-alpha-numeric-random-number-in-aspnet.aspx (il modo super facile , dicono)