Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unique random string generation

Tags:

c#

random

I'd like to generate random unique strings like the ones being generated by MSDN library.(Error Object), for example. A string like 't9zk6eay' should be generated.

like image 335
Kirtan Avatar asked Apr 08 '09 14:04

Kirtan


People also ask

How do you generate unique strings?

If you simply want to generate a unique string and it does not have to be cryptographically secure, then consider using the uniqid() function. It returns a unique identifier based on the current timestamp. echo uniqid( 'user_' , true);

How do you generate random unique alphanumeric strings?

There are many ways to generate a random, unique, alphanumeric string in PHP which are given below: Using str_shuffle() Function: The str_shuffle() function is an inbuilt function in PHP and is used to randomly shuffle all the characters of a string passed to the function as a parameter.

How do you generate random unique strings in Java?

Using randomUUID() java. util. UUID is another Java class that can be used to generate a random string. It offers a static randomUUID() method that returns a random alphanumeric string of 32 characters.


1 Answers

Update 2016/1/23

If you find this answer useful, you may be interested in a simple (~500 SLOC) password generation library I published:

Install-Package MlkPwgen 

Then you can generate random strings just like in the answer below:

var str = PasswordGenerator.Generate(length: 10, allowed: Sets.Alphanumerics); 

One advantage of the library is that the code is better factored out so you can use secure randomness for more than generating strings. Check out the project site for more details.

Original Answer

Since no one has provided secure code yet, I post the following in case anyone finds it useful.

string RandomString(int length, string allowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") {     if (length < 0) throw new ArgumentOutOfRangeException("length", "length cannot be less than zero.");     if (string.IsNullOrEmpty(allowedChars)) throw new ArgumentException("allowedChars may not be empty.");      const int byteSize = 0x100;     var allowedCharSet = new HashSet<char>(allowedChars).ToArray();     if (byteSize < allowedCharSet.Length) throw new ArgumentException(String.Format("allowedChars may contain no more than {0} characters.", byteSize));      // Guid.NewGuid and System.Random are not particularly random. By using a     // cryptographically-secure random number generator, the caller is always     // protected, regardless of use.     using (var rng = System.Security.Cryptography.RandomNumberGenerator.Create()) {         var result = new StringBuilder();         var buf = new byte[128];         while (result.Length < length) {             rng.GetBytes(buf);             for (var i = 0; i < buf.Length && result.Length < length; ++i) {                 // Divide the byte into allowedCharSet-sized groups. If the                 // random value falls into the last group and the last group is                 // too small to choose from the entire allowedCharSet, ignore                 // the value in order to avoid biasing the result.                 var outOfRangeStart = byteSize - (byteSize % allowedCharSet.Length);                 if (outOfRangeStart <= buf[i]) continue;                 result.Append(allowedCharSet[buf[i] % allowedCharSet.Length]);             }         }         return result.ToString();     } } 

Thanks to Ahmad for pointing out how to get the code working on .NET Core.

like image 191
Michael Kropat Avatar answered Oct 02 '22 17:10

Michael Kropat