public static CorrelationVector Spin(string correlationVector) { SpinParameters defaultParameters = new SpinParameters { Interval = SpinCounterInterval.Coarse, Periodicity = SpinCounterPeriodicity.Short, Entropy = SpinEntropy.Two }; return(Spin(correlationVector, defaultParameters)); }
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); } }
/// <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"); }