Question

I'm looking to create a simple short-lived reservation system, and I'd like to generate confirmation numbers that are

  • unique
  • random-looking
  • alphanumeric
  • short-ish, at least much shorter than 32 character-long strings returned by sha1

I'm only looking to have ~500 reservations, so I don't imagine high likelyhood of collissions.

One idea I had is generate an sha1 hash based on a date-time stamp and username, then truncating it to its first 10 characters. Would something like that be reliably unique enough for the purposes of processing ~500 reservations?

Was it helpful?

Solution

There should be no difference in the randomness of any given bit of a SHA-1 hash, so that's possible. Another way would be to fold the hash into itself using XOR until you have 60 bits worth of data, then encode it using Base 64 to get a mostly alpha-numeric result.

This is only necessary if you want to be able to generate the same Id repeatedly for the same input data. Otherwise, if a random id that you generate once, and hold onto after that, use Anders' suggestion. If you get a conflict, just generate another one.

OTHER TIPS

You can use whatever, even a plain random number generator; however, you should check that the reservation code isn't already present. If this is the case, add characters ('x') to the string (date+user) until you get a new random/sha1/etc.

I'm only looking to have ~500 reservations, so I don't imagine high likelyhood of collissions.

Another stupid idea: generate 1000 or 2000 unique random numbers with the desired properties, store them somewhere, and assign them to the users as they register :)

Here's one way to do it 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(); }

I don't remember how long the time() part is, so you may have to adjust the numbers to fit your length. You can also remove that part if you don't need it.

If it's really just 500, then pre-generate 20,000 of them, into a table, then get the "next unused one" when you need it.

Some good tips on this question: How do I create a random alpha-numeric string in C++?

I'd avoid including characters like "1", "l", and "O", "0" and "5", "S", and "Z", "2" in your string, to make it easier for customers when they need to read your reservation code over the phone. The algorithm presented at that link should help you do this.

use a guid? 16 characters, though if you really don't care about collision, you could just choose the first n characters.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top