user2450543
user2450543

Reputation: 3

Generate unique 16 character strings across multiple runs

I have to generate 16 character strings, about 1,00,000 a month. They should be such that they don't repeat across multiple runs (once a month, every month). What is the best method to achieve this? Is using hash functions a good idea? The string can have A-Z and 0-9 only. This is to be done using C#. EDIT: The strings should be random. So, keeping a simple counter is not an option.

Upvotes: 0

Views: 3358

Answers (3)

xen-0
xen-0

Reputation: 709

Since you're limited to 16 alphanumeric characters, a GUID is probably not an option - it requires the full 128 bits to be unique and whilst that will generate a 16 character string, it will not necessarily fit the alphanumeric constraint.

You could have a simple counter and return the last 64 bits of an MD5 hash and check for uniqueness each time.

//parse out hex digits in calling code
static long NextHash(HashSet<long> hashes, int count)
{
    System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
    long l = BitConverter.ToInt64(md5.ComputeHash(IntToArray(count)));
    if(!hashes.Contains(l)){
        hashes.Add(l);
        return l;
    } else return -1; //check this in calling code for failure
}
static byte[] IntToArray(int i)
{
    byte[] bytes = new byte[4];
    for(int j=0;j<4;j++){
    bytes[j] = (byte)i;
    i>>=8;    
    }
}

You could do something similar for GUIDS, but I don't know how likely collisions are when you're only looking at a substring. MD5 hashes have the advantage of "appearing" more random, if that's at all relevant.

Upvotes: 1

Peuczynski
Peuczynski

Reputation: 4733

I don't know if that satisfies you, but I came up with sth like that

static List<string> generate(int count)
{
    List<string> strings = new List<string>();
    while (strings.Count < count)
    {
        Guid g = Guid.NewGuid();                
        string GuidString = g.ToString();
        GuidString = GuidString.Replace("-", "");
        GuidString = GuidString.Remove(16);
        if (!strings.Contains(GuidString))
            strings.Add(GuidString);
    }
    return strings;
}

Upvotes: 0

Uresh Patel
Uresh Patel

Reputation: 115

You have not specified the language.

PHP,

http://php.net/manual/en/function.uniqid.php

echo rand(0,999).uniqid();
rand(0,999) = 3 characters randomly
uniqid() = 13 randomly characters 

Upvotes: 0

Related Questions