Esempio n. 1
0
        public static CorrelationVector Spin(string correlationVector)
        {
            SpinParameters defaultParameters = new SpinParameters
            {
                Interval    = SpinCounterInterval.Coarse,
                Periodicity = SpinCounterPeriodicity.Short,
                Entropy     = SpinEntropy.Two
            };

            return(Spin(correlationVector, defaultParameters));
        }
Esempio n. 2
0
        public static CorrelationVector Spin(string correlationVector, SpinParameters parameters)
        {
            CorrelationVectorVersion version = InferVersion(correlationVector);

            switch (version)
            {
            case CorrelationVectorVersion.V1:
                return(CorrelationVectorV1.Spin(correlationVector, parameters));

            case CorrelationVectorVersion.V2:
                return(CorrelationVectorV2.Spin(correlationVector, parameters));

            default:
                return(null);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Creates a new correlation vector by applying the Spin operator to an existing value.
        /// This should be done at the entry point of an operation.
        /// </summary>
        /// <param name="correlationVector">
        /// Taken from the message header indicated by <see cref="HeaderName"/>.
        /// </param>
        /// <param name="parameters">
        /// The parameters to use when applying the Spin operator.
        /// </param>
        /// <returns>A new correlation vector extended from the current vector.</returns>
        public static CorrelationVector Spin(string correlationVector, SpinParameters parameters)
        {
            if (CorrelationVector.IsImmutable(correlationVector))
            {
                return(CorrelationVector.Parse(correlationVector));
            }

            CorrelationVectorVersion version = CorrelationVector.InferVersion(
                correlationVector, CorrelationVector.ValidateCorrelationVectorDuringCreation);

            if (CorrelationVector.ValidateCorrelationVectorDuringCreation)
            {
                CorrelationVector.Validate(correlationVector, version);
            }

            byte[] entropy = new byte[parameters.EntropyBytes];
            rng.NextBytes(entropy);

            ulong value = (ulong)(DateTime.UtcNow.Ticks >> parameters.TicksBitsToDrop);

            for (int i = 0; i < parameters.EntropyBytes; i++)
            {
                value = (value << 8) | Convert.ToUInt64(entropy[i]);
            }

            // Generate a bitmask and mask the lower TotalBits in the value.
            // The mask is generated by (1 << TotalBits) - 1. We need to handle the edge case
            // when shifting 64 bits, as it wraps around.
            value &= (parameters.TotalBits == 64 ? 0 : (ulong)1 << parameters.TotalBits) - 1;

            string s = unchecked ((uint)value).ToString();

            if (parameters.TotalBits > 32)
            {
                s = string.Concat((value >> 32).ToString(), ".", s);
            }

            string baseVector = string.Concat(correlationVector, ".", s);

            if (CorrelationVector.IsOversized(baseVector, 0, version))
            {
                return(CorrelationVector.Parse(correlationVector + CorrelationVector.TerminationSign));
            }

            return(new CorrelationVector(baseVector, 0, version, false));
        }
 /// <summary>
 /// Not supported in V1.
 /// </summary>
 /// <param name="correlationVector">
 /// Taken from the message header indicated by <see cref="HeaderName"/>.
 /// </param>
 /// <param name="parameters">
 /// The parameters to use when applying the Spin operator.
 /// </param>
 /// <returns>A new correlation vector extended from the current vector.</returns>
 public new static CorrelationVectorV1 Spin(string correlationVector, SpinParameters parameters)
 {
     throw new InvalidOperationException("Spin is not supported in Correlation Vector V1");
 }