/// <summary> /// Generates n sequence numbers k milliseconds apart /// </summary> /// <param name="pseudoUnique">should we call pseudo unique or strongly ordered sequence numbers</param> /// <param name="increasingOrder">should sequence numbers be generated in increasing or decreasing order</param> /// <param name="n">number of sequence numbers generated</param> /// <param name="k">numer of milliseconds apart</param> /// <returns>array of sequence numbers</returns> private static ulong[] GenerateNSequenceNumbersKApart(bool pseudoUnique, bool increasingOrder, int n, int k) { TimeOrderedSequenceNumber seqNumGenerator = new TimeOrderedSequenceNumber(increasingOrder); ulong[] seqNums = new ulong[n]; // This method deliberately has repetitive code to ensure it is fast. // The faster this code runs, the more likely it is we will find collisions quickly if (k <= 0) { // Fast path if (pseudoUnique) { for (int i = 0; i < n; i += 1) { seqNums[i] = seqNumGenerator.GeneratePseudoUniqueSequenceNumber(); } } else { for (int i = 0; i < n; i += 1) { seqNums[i] = seqNumGenerator.GenerateStronglyOrderedSequenceNumber(); } } } else { // Slow path for (int i = 0; i < n; i += 1) { if (pseudoUnique) { seqNums[i] = seqNumGenerator.GeneratePseudoUniqueSequenceNumber(); } else { seqNums[i] = seqNumGenerator.GenerateStronglyOrderedSequenceNumber(); } // No need to call sleep after generating the last sequence number if (i + 1 < n) { Thread.Sleep(k); } } } return(seqNums); }
/// <summary> /// Gets a sequence number and inserts it into the concurrent bag /// </summary> private static void GeneratePseudoUniqueSeqNum() { TimeOrderedSequenceNumber seqNumGenerator = new TimeOrderedSequenceNumber(); seqNums.Add(seqNumGenerator.GeneratePseudoUniqueSequenceNumber()); }