Использование тактов в качестве начального числа

Я использую текущие такты в качестве начального числа для генерации случайных чисел. Случайное число используется в псевдо-GUID, и проверка в моей базе данных убедится, что она еще не существует до возврата. В среднем, этот метод будет вызываться примерно 10 000 раз подряд в течение всего процесса.

Меня беспокоит то, что идентичный номер может быть сгенерирован вплотную, что приведет к нескольким ненужным рекурсивным вызовам в моей базе данных, проверяющим один и тот же идентификатор. Я хотел бы избежать этого, если это возможно. Каков наилучший способ проверить этот сценарий?

Если это имеет значение, приложение .NET 4 и база данных SQL Server 2008.

private static string GenerateUniqueDelId()
{
    // Generate a random integer using the current number of clock ticks as seed.
    // Then prefix number with "DEL" and date, finally padding random integer with leading zeros for a fixed 25-character total length.
    int seed = (int)DateTime.Now.Ticks;
    Random number = new Random(seed);
    string id = string.Format("DEL{0}{1}", DateTime.Today.ToString("yyyyMMdd"), number.Next().ToString("D14"));

    // Lookup record with generated ID in Sesame. If one exists, call method recursively.
    string query = "SELECT * FROM Lead WHERE Esm_Id = @Esm_Id";
    SqlParameter[] parameters = { new SqlParameter("@Esm_Id", id) };
    if (DataManager.GetRow(query, parameters, DelConnection.Sesame) != null) return GenerateUniqueDelId();

    // Otherwise, return ID.
    return id;
}   //// End GenerateUniqueDelId()
 Matthew05 июн. 2012 г., 21:32
В качестве альтернативы использованию случайного числа, вы можете использоватьIdentity колонка вместо?
 YavgenyP05 июн. 2012 г., 21:27
Если вы собираетесь на сервер SQL для проверки их выхода, то почему вы не можете сгенерировать их там в первую очередь?
 Erik Philips05 июн. 2012 г., 21:32
Почему бы просто не использовать GUID. Я не большой поклонник воссоздания колеса.

Ответы на вопрос(2)

Решение Вопроса

Random экземпляр из тела вашего метода - в противном случае вы будете повторно заполнять одно и то же значение много раз, что приведет к одинаковой числовой последовательности.

Также вы как бы заново изобретаете колесо: конструктор по умолчаниюRandom класс уже использует текущее время часов как начальное значение по умолчанию.

Вопрос в том, почему вы не избегаете всего этого и просто используете автоматически сгенерированный Guid на стороне базы данных?

 Brian05 июн. 2012 г., 21:45
Да, и в отношении стандартного конструктора Random, спасибо за информацию. Не знал, что по умолчанию используются такты часов - я обязательно обновлю это в своем коде!
 Brian06 июн. 2012 г., 01:29
Я закончил тем, что двигалсяRandom вне моей петли, чтобы я мог передать его вGenerateUniqueDelId(Random generator).
 Brian05 июн. 2012 г., 21:39
Этот идентификатор используется в системе внешнего поставщика и имеет определенные критерии форматирования: длина 25 символов, с префиксом 3 буквенных символа и датой в формате ггггMMdd. Я действительно могу играть только с оставшимися 14 персонажами.

When you see the word "random" in a question title on Stack Overflow you can almost guarantee it will be the same fundamental problem as countless similar questions. This article takes a look at why randomness causes so many problems, and how to address them.

Проверьте его статью о генераторах случайных чисел

http://csharpindepth.com/Articles/Chapter12/Random.aspx

в основном его решение выглядит так:

using System;
using System.Threading;

public static class RandomProvider
{    
    private static int seed = Environment.TickCount;

    private static ThreadLocal<Random> randomWrapper = new ThreadLocal<Random>(() =>
        new Random(Interlocked.Increment(ref seed))
    );

    public static Random GetThreadRandom()
    {
        return randomWrapper.Value;
    }
}
 24 мая 2016 г., 20:50
Я все еще получил дубликаты, используя Environment.TickCount в качестве начального числа. В итоге я использовал (int) DateTime.UtcNow.Ticks и еще не получил повторяющихся результатов.
 Brian05 июн. 2012 г., 21:42
Спасибо, я обязательно прочитаю эту статью.
 31 янв. 2018 г., 17:50
@JoshDeLong - это забавная вещь о случайности; Он не обещает никогда не доставлять дубликаты :)

Ваш ответ на вопрос