在多次运行中生成唯一的16个字符串

时间:2013-06-10 06:30:01

标签: c# hash unique

我必须生成16个字符串,每月大约1,00,000个字符串。它们应该是这样的,它们不会在多次运行中重复(每月一次,每月一次)。实现这一目标的最佳方法是什么?使用哈希函数是个好主意吗? 该字符串只能有A-Z和0-9。 这是使用C#完成的。 编辑:字符串应该是随机的。因此,保留一个简单的计数器不是一种选择。

3 个答案:

答案 0 :(得分:1)

由于您只限制了16个字母数字字符,因此GUID可能不是一个选项 - 它要求完整的128位是唯一的,而这将生成一个16个字符的字符串,它不一定符合字母数字约束。 / p>

你可以有一个简单的计数器并返回MD5哈希的最后64位并每次检查唯一性。

//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;    
    }
}

您可以为GUIDS做类似的事情,但我不知道当您只查看子字符串时碰撞的可能性。 MD5哈希具有“出现”更随机的优势,如果这完全相关的话。

答案 1 :(得分:0)

您尚未指定语言。

PHP,

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

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

答案 2 :(得分:0)

我不知道这是否让你满意,但我想出了那样的

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;
}