Подтвердить что ты не робот

Создание уникальных числовых идентификаторов с использованием DateTime.Now.Ticks

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

Я думал использовать DateTime.Now.Ticks для этого ID, но хотел бы знать, может ли DateTime.Now.Ticks генерировать встречный идентификатор, если одновременные запросы обрабатываются одновременно?

Если кто-то может предложить лучший способ генерировать эти идентификаторы (желательно тот, который не является Int64, например Tick), в многопоточной среде, пожалуйста, дайте мне знать. Нечто такое же простое, как инкрементирующее число, было бы достаточно даже, если бы мне не пришлось блокировать число до приращения.

Большое спасибо за любую помощь.

4b9b3361

Ответ 1

Вам просто нужно использовать статическую переменную, которая увеличивается каждый раз, когда вам нужно другое уникальное значение. Вы можете сделать этот поток безопасным и все еще очень быстрым, используя метод Interlocked.Increment...

// Declaration
private static int safeInstanceCount = 0;

// Usage
{
      ...
      Interlocked.Increment(ref safeInstanceCount);
      ...
}

Ответ 2

DateTime.Now абсолютно ужасен для этой цели. В лучшем случае у вас будет разрешение 1 миллисекунды; в худшем случае, 17 мс на NT и 1 секунду (!) на CE/Compact Framework.

Рассмотрим метод Interlocked.Increment для быстрого, потокобезопасного счетчика.

Ответ 3

Начните с идентификатора для каждого потока (если несколько потоков инициируют запросы), объединенные с помощью счетчика на поток (если ожидается, что в каждом потоке будет создано более одного запроса).

Ответ 4

Просто получите сильное случайное число или используйте GUID

Если высокая производительность - это ДОЛЖНА иметь функцию, выделяйте последовательные числа в монотонной последовательности. Предотвратите блокировку путем "резервирования" диапазона (например, 20-100) идентификатора для каждого потока, который обрабатывает сообщения. Таким образом, вам нужно будет заблокировать генератор последовательности только один раз в 20-100 итерациях.

Ответ 5

Если вы знаете, сколько потоков у вас будет (или, по крайней мере, верхняя граница), вы можете разделить ваше пространство идентификаторов между вашими потоками, вычислив ID как значение (ниточный локальный) счетчик и Идентификатор потока - например, counter_value++ << 8 | thread_id. Таким образом, координация или блокировка между потоками не требуется, и для генерации идентификатора требуется только приращение, бит-сдвиг и/или.

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