Come garantire che un timestamp sia sempre univoco?

Come garantire che un timestamp sia sempre univoco?

Un modo per ottenere una sequenza rigorosamente ascendente di timestamp senza duplicati è il codice seguente.

Rispetto alle altre risposte qui presenti, questa presenta i seguenti vantaggi:

  1. I valori seguono da vicino i valori effettivi in ​​tempo reale (tranne in circostanze estreme con tassi di richiesta molto elevati quando sarebbero leggermente in anticipo rispetto al tempo reale).
  2. È privo di blocco e dovrebbe funzionare meglio delle soluzioni che utilizzano lock dichiarazioni.
  3. Garantisce l'ordine crescente (semplicemente aggiungere un looping a un contatore non lo fa).

public class HiResDateTime
{
   private static long lastTimeStamp = DateTime.UtcNow.Ticks;
   public static long UtcNowTicks
   {
       get
       {
           long original, newValue;
           do
           {
               original = lastTimeStamp;
               long now = DateTime.UtcNow.Ticks;
               newValue = Math.Max(now, original + 1);
           } while (Interlocked.CompareExchange
                        (ref lastTimeStamp, newValue, original) != original);

           return newValue;
       }
   }
}

Ehm, la risposta alla tua domanda è che "non puoi", poiché se due operazioni si verificano contemporaneamente (cosa che accadranno nei processori multi-core), avranno lo stesso timestamp, indipendentemente dalla precisione che riesci a raccogliere.

Detto questo, sembra che ciò che desideri sia una sorta di contatore thread-safe con incremento automatico. Per implementarlo (presumibilmente come servizio globale, magari in una classe statica), dovresti usare il Interlocked.Increment metodo e se hai deciso di aver bisogno di più di int.MaxValue versioni possibili, anche Interlocked.Read .


DateTime.Now viene aggiornato solo ogni 10-15 ms.

Non è un imbroglio di per sé, ma questo thread ha alcune idee su come ridurre i duplicati/fornire una migliore risoluzione temporale:

Come ottenere il timestamp della precisione del tick in .NET / C#?

Detto questo:i timestamp sono chiavi orribili per le informazioni; se le cose accadono così velocemente potresti volere un indice/contatore che mantenga l'ordine discreto degli elementi mentre si verificano. Non c'è ambiguità lì.