Creating a unique alphanumeric 10-character string

隐身守侯 提交于 2019-12-17 16:39:07

问题


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?


回答1:


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.




回答2:


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 :)




回答3:


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.




回答4:


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.




回答5:


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.




回答6:


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




回答7:


In C# you can use http://www.dotnetfunda.com/forums/thread1357-how-do-generate-unique-alpha-numeric-random-number-in-aspnet.aspx (the super easy way, they say)



来源:https://stackoverflow.com/questions/467444/creating-a-unique-alphanumeric-10-character-string

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!