Как увеличить скорость HashSet при использовании, чтобы избежать создания дублирующихся записей - PullRequest
2 голосов
/ 12 марта 2019

Мне нужно сгенерировать примерно 500 000 уникальных кодов для каждого из наших клиентов.

Код запускается через несколько минут, однако мне нужно убедиться, что нет столкновений, поэтому я добавил эту логику, чтобы использовать HashTable. Это привело к тому, что производительность заняла более 8 часов, генерируя всего 200 тыс.

Есть ли что-нибудь, что я могу использовать для улучшения производительности?

Узким местом производительности является поиск HashSet (около строки 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;
}

1 Ответ

4 голосов
/ 12 марта 2019

DateTime.UtcNow изменяется со скоростью ледниковых по сравнению с тем, насколько быстрым является современный процессор, и это, кажется, ваш единственный источник случайности при генерации ваших кодов 1 . Также нет способа восстановить это значение и проверить хеш MD5 2 , так что я не уверен, какое значение оно добавляет.

Вместо этого используйте криптографический генератор случайных чисел, чтобы сгенерировать некоторую реальную случайность и использовать ее в своих кодах. Но не забудьте включить необработанное значение в код, если вам нужно проверить хеш.


1 Это означает, что вы, скорее всего, потратите возрастов на создание «новых» кодов, которые точно соответствуют предыдущему коду, пока время не изменится.

2 N.B. Вы не должны использовать MD5 в новой работе либо ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...