Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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());
        }