2012-03-22 2 views
1

QueryPerformanceCounter() и Stopwatch.GetTimestamp() оба возвращают количество отсчетов от одного из процессоров. Я хотел бы использовать возвращаемое 64-битное целочисленное значение как уникальный идентификатор, и мне интересно, возможно ли, что эти функции возвращают одно и то же значение, когда они вызываются несколько раз в процессе.Может ли QueryPerformanceCounter() или Stopwatch.GetTimestamp() возвращать одно и то же значение в последующих вызовах?

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

В документации указывается, что материнская плата не поддерживает высокопроизводительные таймеры, но все, с чем я работал, имели эту поддержку. Мой код будет работать только на 32-битном или 64-битном серверном оборудовании, где я считаю, что высокопроизводительные таймеры всегда поддерживаются (хотя я не уверен, хотя).

Я мог бы написать небольшую тестовую программу для тестирования, но этот тест будет действителен только на моем собственном компьютере, поэтому я ищу более окончательный ответ, если он доступен.

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

ответ

2

Ни одна из функций, предназначенных для возврата уникальных идентификаторов. На самом деле, вероятно, 2 последующих вызова возвратят одно и то же значение.

Для уникальных идентификаторов рассмотрите возможность использования Guid.NewGuid или просто иметь счетчик с (с блокировкой) приращения при каждом вызове «дать мне идентификатор».

Доказательства концепции «QueryPerformanceCounter» возвращает то же значение:

class Test 
{ 
    void Main() 
    { 
    long start1;  
    long start2; 
    QueryPerfCounter.QueryPerformanceCounter(out start1); 
    QueryPerfCounter.QueryPerformanceCounter(out start2); 

    System.Console.WriteLine(start1); 
    System.Console.WriteLine(start2); 
    } 

    [System.Runtime.InteropServices.DllImport("KERNEL32")] 
    public static extern bool QueryPerformanceCounter(out long lpPerformanceCount); 
} 
+0

Я знаю, что они не * разработаны * tp возвращают уникальные идентификаторы, но если они возвращают постоянно возрастающие значения, это нормально. Почему вы говорите, что они, вероятно, вернут одинаковые ценности? – xxbbcc

+0

Оба показывают текущее значение таймера - 2 последующих звонка, чтобы показать одно и то же «время» - запустить образец в отредактированном ответе, чтобы увидеть результаты. –

+0

@xxbbcc, когда это тривиально простые в использовании методы, предназначенные для генерации уникальных идентификаторов, почему бы вам избежать использования методов, которые не предназначены для этого? – Yaur

-1

Если вы хотите использовать его для удостоверения личности, вам нужно объединить эту величину с другим «случайным» числом. Но для точности вам нужно позвонить QueryPerformanceCounter(), а не Stopwatch.GetTimestamp().

+0

-1. Оба возвращают одинаковое значение в [Секундомер.GetTimestamp] (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.gettimestamp (v = VS.100) .aspx). –