C# 如何提高哈希集的速度以确保不会生成重复记录

C# 如何提高哈希集的速度以确保不会生成重复记录,c#,.net,list,hashset,C#,.net,List,Hashset,我需要为每个客户生成大约500k的唯一代码 代码将在几分钟内运行,但是,我需要确保没有冲突,因此我添加了此逻辑以使用哈希表。 这导致性能需要8个多小时才能生成20万个 有什么我可以用来提高性能的吗 性能瓶颈是第8行附近的哈希集查找。还有哪些其他选项可以提高确保没有重复的性能 public string GenerateUniqueReferralCode(CustomerObj customer, HashSet<string> assignedCodes) { bool i

我需要为每个客户生成大约500k的唯一代码

代码将在几分钟内运行,但是,我需要确保没有冲突,因此我添加了此逻辑以使用哈希表。 这导致性能需要8个多小时才能生成20万个

有什么我可以用来提高性能的吗

性能瓶颈是第8行附近的哈希集查找。还有哪些其他选项可以提高确保没有重复的性能

public string GenerateUniqueReferralCode(CustomerObj customer, HashSet<string> assignedCodes)
{
    bool isUnique = false;
    string code = String.Empty;
    do
    {
        code = GenerateReferralCode(customer);
        if (!assignedCodes.Contains(code))
        {
            isUnique = true;
        }
        else
        {
            isUnique = false;
        }
    } while (!isUnique);
    return code;
}

public string GenerateReferralCode(CustomerObj customer)
{
    var code = String.Empty;
    //replace special characters and only keep alpha

    var name = customer.Profile.FirstName + customer.Profile.LastName;
    name = new String(name.Where(Char.IsLetter).ToArray());

    if (name.Length > 3)
    {
        code += name.Substring(0, 4).ToUpperInvariant();
    }
    else
    {
        code += customer.Profile.FirstName.Substring(0, customer.Profile.FirstName.Length).ToUpperInvariant();
    }

    code += CreateMD5(customer.Profile.Email + DateTime.UtcNow.ToString());

    code = code.Substring(0, 7);

    return code;
}
与现代处理器的速度相比,DateTime.UtcNow的变化速度非常缓慢,这似乎是生成代码的唯一随机性来源1。也无法恢复此值并验证MD52哈希,因此我不确定它添加了什么值

相反,使用加密随机数生成器生成一些真实的随机性,并在代码中使用。但是如果需要验证散列,请不要忘记在代码中包含原始值

1这意味着您很可能会花很长时间循环创建与以前代码完全匹配的新代码,直到时间发生变化


2N.B。您也不应该在新作品中使用MD5…

您知道您正在生成一个字符串,该字符串从名称中选择前四个字符,只返回7个字符,MD5哈希值构成最后3个字符。因为输出的十六进制值只有16^3个可能值。除非我遗漏了什么,否则你的代码只能生成4096个唯一代码。为了得到200k,你必须做一些不同于这里代码的事情。作为一个基准-我的计算机可以在3秒钟内生成500_000个哈希代码。您的代码应该能够在类似的时间内完成。Enumerable.Range0,500000.Selectx=>CreateMD5x.ToString.ToList;生成一个唯一的没有冲突机会的代码非常简单,它是code=code+1。其中500K只需要几分之一秒。您真正想要做的似乎不是让猜测原始代码值变得容易。不清楚为什么这很重要,加密需要有多强,千万不要从网站上听取安全建议。@Enigmativity是的,我正在尝试生成一个客户友好的代码,他们可以用来推荐朋友。类似于johnm4b2的东西,客户名为john m。我希望代码引用客户名称,这就是为什么会有冲突,因为有些人有相同的相似名称。您希望每个客户生成多少代码?